如何从光标中获取行ID?
答案 0 :(得分:13)
我不认为Cursor会直接暴露这个
SQLiteDatabase.insert()
返回新插入行的行ID。或者在Android中,惯例是有一个名为"_id"
的列,其中包含表的主要自动增量键。因此cursor.getLong(cursor.getColumnIndex("_id"))
会检索此内容。
答案 1 :(得分:4)
我遇到了同样的问题,其中主键的列索引报告为-1(表示它不存在)。问题是我忘了在创建游标的初始SELECT子句中包含_ID列。一旦我确定它被包含在内,就可以像其他任何一个一样访问该列。
答案 2 :(得分:3)
关于Nic Strong的答案的最后一句话,以下命令对我不起作用。 cursor.getColumnIndex("_id")
仍为-1
cursor.getLong(cursor.getColumnIndex("_id"))
也许在我的配置中还有其他一些导致问题的问题?
我个人已经开始在我创建的每个表中维护自己的自定义唯一id列;痛苦,但它解决了这个问题。
答案 3 :(得分:2)
return sqlite_db.query(table, new String[] { "rowid", "*" }, where, args, null, null, null);
在我的情况下,我在DataManager.FIELD_ID中有“rowid”,这是SQLite标识列(sqlite中的每个表都有这种特殊的列),所以我不需要在表中使用任何自己的自定义唯一id列
答案 4 :(得分:0)
Cursor cursor = mySQLiteHelper.getReadableDatabase().query(TABLE_NAME, new String[] { "ROWID", "*" }, where, null, null, null, null);
然后
long rowId = cursor.getLong(0);
答案 5 :(得分:0)
只要未使用 WITHOUT ROWID
定义TABLE,您就可以获得 ROWID (或者应该 rowid 如果您将其指定为要检索的列,则在下面进行说明。
例如,对于包含3个已定义列(名称,颜色和年龄)但没有常规 _id 列的表格。以下rawQuery可以工作并返回 ROWID : -
Cursor csr = db.rawQuery("SELECT Names, Colour, Age, ROWID FROM " + TABLE_NAME,null);
注意!光标中的列名称是小写 ,具体如下: -
注意! SELECT SQL 中的 ROWID 与案例无关(例如RoWiD正常工作)。
使用
Cursor csr = db.rawQuery("SELECT * FROM " + TABLE_NAME,null);
不会返回 ROWID (对于使用query
方法的列,同样为null)。
使用query
(而不是rawQuery
)以相同的方式工作,即您需要指定ROWID(请注意下面的ROWID的替代方法)作为列例如,检索: -
Cursor csr = db.query(TABLE_NAME,new String[]{
"OiD",
"Names",
"Colour",
"Age"
},null,null,null,null,null);
除了 ROWID
,您还可以使用 _ROWID_
或 OID
(与案例无关) )作为查询中的列名,注意到结果游标中的列名是 rowid ,即它是小写。