Android SQLite中是否需要“_id”字段?
答案 0 :(得分:54)
_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;
您会发现_id
和ROWID
都具有相同的值。
请注意,如果您在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";
}