Android SQLite中是否需要"_id"字段?
当您使用使用Cursor的增强型适配器(例如ResourceCursorAdapter)时,_id非常有用.这些适配器使用它来提供一个ID,该ID可用于引用表中的特定行,该行将该项与任何适配器所用的项相关联(例如,ListView中的行).
如果您不打算在游标中使用需要_id列的类,则没有必要,您也可以使用"as _id"使另一列显示为在游标中称为_id.
为什么不使用_ROWID_?
SQLite无论如何都为每行提供了这个,所以你可以在select语句中将它别名为_id.
从技术上讲,不需要该字段_id
,但是如果您正在使用CursorAdapter
该类(您可能正在使用该类,特别是如果您正在使用记事本示例)则是
"游标必须包含一个名为"_id"的列,否则此类将无效"
该文件另有说明这里.不幸的是,代码示例并未明确这一点.
在许多情况下,拥有一个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);
来自官方文档 ......
Cursor必须包含名为"_id"的列,否则此类将不起作用.此外,如果合并的游标在其"_id"列中具有重叠值,则使用MergeCursor与此类不起作用.
而且Cursor
是:
此接口提供对数据库查询返回的结果集的随机读写访问.
换句话说,你需要_id
Android SQLite(通常使用Cursor)
如果将_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;
你会发现两者_id
并ROWID
具有相同的价值.
请注意,如果在CREATE中使用DESC,则会创建一个新列,ROWID
而不是别名.