关于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;
你会发现_id
和ROWID
具有相同的值。
请注意,如果在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。