2011-09-27 96 views
11

可能重复:
Get generated id after insert的Android SQLite的获得最后插入的行ID

我想用这个代码来获得最后插入的行ID在我的Android应用程序:

String query = "SELECT * from SQLITE_SEQUENCE"; 
int createdUserId = Integer.parseInt(dbHelper.executeSQLQuery(query).toString()); 

但问题是,它引发了一个异常,无法将dbHelper.executeSQLQuery(query).toString()转换为 整数。我并不擅长sqlite,但我认为这应该会返回插入的最后一行id ...这肯定会是int(至少我认为是这样)。所以,如果这不是正确的方式,有人可以请指导我如何获取Android应用程序中的最后一行ID。

谢谢!

+0

什么是dbHelper的一个实例? – Squonk

+3

为什么'SELECT'语句*会插入任何东西?如果您实际上会*插入*,例如'SQLiteDatabase.insert(...)',您将返回“新插入的行的行ID,如果发生错误,则返回-1”。 –

+0

@MisterSquonk它是我的DatabaseHelper类的一个实例。 –

回答

34

您的SQL工具将返回所有行ID,而不仅仅是最新的。尝试这样的事情......

SELECT ROWID from SQL_LITE_SEQUENCE order by ROWID DESC limit 1 

另外请注意,我相信从SQL_LITE_SEQUENCE选择会得到任何表最新的ID,您还可以通过任何表中选择ROWID,并获得公正的标识访问SQL_LITE_SEQUENCE那张桌子。 IE

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精简版文档调用ROWID和整数,它是一个64位整数,所以在Java中它是应该作为一个长检索。)

+0

不是原子的,不安全的。编辑:删除downvote,我认为这是要求另一件事。 –

+0

有一种理论上的可能性,这可能不会给出正确答案,因为如果从数据库中删除行并添加新行,在大量插入之后,rowid可能会达到极限,在此时sqlite将尝试挑选随机数rowid插槽使用一段时间。如果发生这种情况,显然最后插入的行没有最大的数值,因此仅对行ID进行排序就不足够。 [AutoIncrement In SQLite](https://www.sqlite.org/autoinc.html) – Timo

12

小心使用“selectlast_insert_rowid()”? :)

+0

嘿,你可以解释一下,喜欢,如何执行?我正在尝试浮动编码器的答案,但它没有执行:( –

+0

对不起,但我不确定你的问题是什么,也许你应该开一个新的问题,在那里你可以提供有关问题的更多细节 – JimmyB

+1

This是正确的查询︰SELECT ROWID from MYTABLE order by ROWID DESC limit 1 –