如何从Cursor获取行ID

时间:2010-05-17 09:55:44

标签: android

如何从光标中获取行ID?

6 个答案:

答案 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);

注意!光标中的列名称是小写 ,具体如下: -

enter image description here

注意! 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 ,您还可以使用 _ROWID_ OID (与案例无关) )作为查询中的列名,注意到结果游标中的列名是 rowid ,即它是小写