关于Android SQLite中的“_id”字段

时间:2010-07-07 05:09:15

标签: android sqlite

Android SQLite中是否需要“_id”字段?

9 个答案:

答案 0 :(得分:54)

当您使用使用Cursor的增强适配器(例如ResourceCursorAdapter)时,

_id非常有用。这些适配器使用它来提供一个ID,该ID可用于引用表中的特定行,该行与适用于所用适配器的项目相关(例如,ListView中的行)。

如果您不打算在游标中使用需要_id列的类,则没有必要,您也可以使用“as _id”使另一列显示为在游标中称为_id。

答案 1 :(得分:22)

为什么不使用_ROWID_

SQLite无论如何都会为每一行提供此功能,因此您可以在select语句中将其别名为_id。

答案 2 :(得分:11)

从技术上讲,不需要字段_id,但是如果您正在使用CursorAdapter类(您可能正在使用它,特别是如果您正在使用记事本示例)那么是

  

“Cursor必须包含名为”_id“的列,否则此类不会   工作“

如文档here中所述。不幸的是,代码示例并未明确说明这一点。

答案 3 :(得分:9)

在许多情况下,拥有一个id字段非常方便。我更喜欢自动递增(如下所示)。我一直在寻找id字段的新用途:)

当需要将数据附加到适配器时,我喜欢使用表名别名来将id字段查询为_id。示例:SELECT id _id, msg from message order by id。这样适配器就会看到一个名为_id的字段,每个人都很开心。

以下是我如何定义表格的示例:

CREATE TABLE message (_id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, tripID TEXT, msg TEXT);

答案 4 :(得分:6)

来自official docs ...

  

Cursor必须包含名为" _id"的列。或者这个课不起作用。此外,如果合并的游标在其" _id"中有合并的游标,则使用此类的MergeCursor将不起作用。列。

Cursor是:

  

此接口提供对数据库查询返回的结果集的随机读写访问。

换句话说,Android SQLite(通常使用Cursor)需要_id

答案 5 :(得分:6)

如果将_id列定义为自动递增整数,则它实际上是SQLite默认提供的ROWID列的别名(https://www.sqlite.org/lang_createtable.html#rowid)。

您的create语句需要采用以下形式...

CREATE TABLE t(_id INTEGER PRIMARY KEY ASC, y, z);

证明这有效......

UPDATE t SET _id=22 WHERE _id=11;

然后

SELECT ROWID, _id FROM t;

您会发现_idROWID都具有相同的值。

请注意,如果您在CREATE中使用DESC,则会创建一个新列,并且ROWID没有别名。

答案 6 :(得分:2)

当然不是。 它是一个便利领域,像ListView这样的一些小部件用来填充数据。看到这篇好文章: http://www.casarini.org/blog/2009/android-contentprovider-on-sqlite-tables-without-the-_id-column/

答案 7 :(得分:0)

当然,如果您要创建自己的UI小部件和自己的适配器,则不必将主键命名为“_id”。它可以是您想要的任何名称。但是,您将负责管理UI小部件集合并将它们绑定到数据库中的右侧行。 “_id”仅对Brad所指出的ListView有用。

答案 8 :(得分:0)

在sqlite中,确实需要_id字段,它将帮助您从sqlite中选择特定数据。

SELECT name from table_name where _id = ?

如果您正在创建一个recyclerview / listview,并且想要该列表项的详细活动,则确实需要一个ID来获取该列表项的数据。

如果您要为常量创建类,则android中有BaseColumn接口, 为该常量类提供_ID字段。

//from android documentation..
  public static class FeedEntry implements BaseColumns {
        public static final String TABLE_NAME = "entry";
        public static final String COLUMN_NAME_TITLE = "title";
        public static final String COLUMN_NAME_SUBTITLE = "subtitle";
    }