关于Android SQLite中的“_id”字段

Android SQLite中需要字段“_id”吗?

在使用使用光标的增强型适配器(如ResourceCursorAdapter)时,_id非常有用。 它被这些适配器用来提供一个ID,它可以用来引用表中与该适配器用于的任何项目(例如ListView中的行)相关的特定行。

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

为什么不使用_ROWID_ ?

无论如何,SQLite为每一行都提供了这个function,所以你可以在你的select语句中将它别名为_id。

从技术上讲,不需要字段_id ,但是如果你正在使用CursorAdapter类(你可能是,尤其是如果你正在使用记事本的例子),那么是的

“游标必须包含一个名为”_id“的列,否则这个类将不起作用”

正如这里的文档所解释的那样。 不幸的是,这些代码示例并没有说明这一点。

在很多情况下,有一个id字段是相当方便的。 我更喜欢我的自动递增(如下所示)。 我总是findid字段的新用途:)

当需要将数据附加到适配器时,我喜欢使用表名称别名来将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); 

从官方文件 …

游标必须包含一个名为“_id”的列,否则这个类将不起作用。 此外,如果合并的游标在其“_id”列中具有重叠值,则对此类使用MergeCursor将不起作用。

Cursor是:

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

换句话说,你需要_id为Android的SQLite(它通常使用光标)

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

您的创build声明需要采取的forms…

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

为了certificate这一点…

 UPDATE t SET _id=22 WHERE _id=11; 

然后

 SELECT ROWID, _id FROM t; 

你会发现_idROWID具有相同的值。

请注意,如果在CREATE中使用DESC,则会创build一个新列,并且ROWID不是别名。

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

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