安卓Sqlite获取最后插入行的ID

12

可能是重复问题:
获取插入后生成的id

我想在我的Android应用程序中使用此代码获取最后插入的行ID:

String query = "SELECT * from SQLITE_SEQUENCE";
int createdUserId = Integer.parseInt(dbHelper.executeSQLQuery(query).toString());
但问题是它抛出一个异常,无法将 dbHelper.executeSQLQuery(query).toString() 转换为整数。我不太擅长sqlite,但我认为这应该返回插入的最后一行id... 这肯定是int(至少我这么认为)。所以如果这不是正确的方法,有人能指导我如何在android应用程序中获取最后一行id吗?
谢谢!

dbHelper是哪个实例? - Squonk
3
为什么SELECT语句会插入任何内容?如果您使用SQLiteDatabase.insert(...)实际上插入了某些内容,您将返回“新插入行的行ID,如果发生错误则为-1”。 - Philipp Reichart
@MisterSquonk 这是我 DatabaseHelper 类的一个实例。 - Android-Droid
@Bombastic:看不到你的辅助类和 executeSQLQuery(...) 方法的代码,很难说。但 Philipp 可能是正确的 - SELECT 操作不会返回最后插入的行 ID,并且您需要在实际插入内容时进行检查。 - Squonk
1
@Bombastic:dbHelper.executeSQLQuery(query) 返回一个 Cursor 实例,因此你正在执行 Integer.parseInt(Cursor.toString()),这永远不会起作用。假设你的表的 id 列是带有 AUTOINCREMENTlong 类型,那么 FloatingCoder 的方法将起作用,尽管你仍然会从查询中得到一个 Cursor,并且你必须使用 moveFirst() 来访问 id 的值。 - Squonk
显示剩余2条评论
2个回答

36

您的SQL语句将返回所有行的ID,而不仅仅是最新的。尝试使用类似以下的内容...

SELECT ROWID from SQL_LITE_SEQUENCE order by ROWID DESC limit 1

还要注意的是,我认为从SQL_LITE_SEQUENCE中选择将会获取到任何表中最新的ID,你也可以通过在任何表上选择ROWID来访问SQL_LITE_SEQUENCE,并仅获取该表的ID。例如

SELECT ROWID from MYTABLE order by ROWID DESC limit 1

感谢MisterSquonk在评论中指出的下一步操作,为了便于日后参考,我将其添加在这里。

查询语句将返回一个包含结果的Cursor对象,因此要访问整数值,您应该像这样做(为了他人的方便,我将替换更常见的方法而不是您的助手方法):

String query = "SELECT ROWID from MYTABLE order by ROWID DESC limit 1";
Cursor c = db.rawQuery(query);
if (c != null && c.moveToFirst()) {
    lastId = c.getLong(0); //The 0 is the column index, we only have 1 column, so the index is 0
}

(请注意,尽管SQL Lite文档将ROWID称为Integer,但它是一个64位整数,在Java中应该作为long类型检索。)


非原子的,不安全的。编辑:已删除负评,我以为那是在问另一件事。 - Jorge Fuentes González
有一个理论上的可能性,即如果从数据库中删除行,然后添加新行,在大量插入之后,rowid 可能会达到其限制,此时 SQLite 将尝试选择随机的 rowid 插槽一段时间。如果发生这种情况,那么显然最后插入的行并不具有最大的数值,因此仅对行 ID 进行排序是不够的。 SQLite 中的自动增量 - Timo

12

嘿,你能否请详细说明一下,如何执行这个程序呢?我正在尝试使用Floating Coder的回答,但是它没有执行成功 :( - Vikas Gupta
1
这是正确的查询语句:SELECT ROWID from MYTABLE order by ROWID DESC limit 1。 - Marek Bar
我认为这将为您提供任何表中的最后一个id,而不仅仅是您的表中的最后一个,对吗? - weberc2
1
@weberc2,last_insert_rowid()将返回当前会话中执行的最近插入语句所产生的ID,无论该表是什么。 - JimmyB
1
@Marek Bar 如果你正在处理事务,就不要(使用它)... - Beep.exe
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接