【问题标题】:Android Sqlite get last insert row id [duplicate]Android Sqlite获取最后一个插入行ID [重复]
【发布时间】:2011-11-26 08:55:54
【问题描述】:

可能重复:
Get generated id after insert

我想使用以下代码在我的 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 是什么实例?
  • 为什么 SELECT 声明 insert 什么?如果你真的要 insert 一些东西,比如SQLiteDatabase.insert(...),你会得到“新插入行的行 ID,如果发生错误,则返回 -1”。
  • @MisterSquonk 这是我的 DatabaseHelper 类的一个实例。
  • @Bombastic:没有看到你的帮助类和executeSQLQuery(...)方法的代码,这是不可能的。不过 Philipp 可能是正确的 - SELECT 操作不会返回最后插入的行 ID,您需要在实际插入内容时检查它。
  • @Bombastic: dbHelper.executeSQLQuery(query) 返回一个 Cursor 的实例,因此你正在做 Integer.parseInt(Cursor.toString()) 这永远不会工作。假设表的id 列是longAUTOINCREMENT,那么FloatingCoder 的方法将起作用,尽管您仍然会从查询中得到Cursor,并且您必须使用moveFirst() 才能能够访问 id 的值。

标签: android sqlite


【解决方案1】:

愿意使用“selectlast_insert_rowid()”吗? :)

【讨论】:

  • 嘿,你能解释一下吗,请喜欢,如何执行这个?我正在尝试浮动编码器的答案,但它没有执行:(
  • 抱歉,我不确定您的问题是什么。也许您应该打开一个新问题,在那里您可以提供有关问题所在的更多详细信息。
  • 这是正确的查询:SELECT ROWID from MYTABLE order by ROWID DESC limit 1
  • @weberc2, last_insert_rowid() 将返回在当前会话中执行的 最新 insert 语句产生的 ID,无论表可能是什么。
  • @Marek Bar NOT(如果您正在处理交易)...
【解决方案2】:

您的 SQL 语句将返回所有行 ID,而不仅仅是最新的。试试这样的...

SELECT ROWID from SQL_LITE_SEQUENCE order by ROWID DESC limit 1

另外请注意,我相信从 SQL_LITE_SEQUENCE 中选择将从任何表中获取最新的 ID,您还可以通过在任何表上选择 ROWID 并仅获取该表的 ID 来访问 SQL_LITE_SEQUENCE。浏览器

SELECT ROWID from MYTABLE order by ROWID DESC limit 1

感谢 MisterSquonk 指出 cmets 的下一步,将其添加到此处以方便以后参考...

查询语句将返回一个包含结果的 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 检索。)

【讨论】:

  • 不是原子的,不安全的。编辑:删除了反对票,我认为这是在问另一件事。
  • 理论上这可能不会给出正确的答案,因为如果从数据库中删除行然后添加新行,在大量插入后,rowid 可能会达到它的限制点 sqlite 将尝试选择随机的 rowid 插槽使用一段时间。如果发生这种情况,那么显然最后插入的行没有最大的数值,因此简单地对行 ID 进行排序是不够的。 Autoincrement In SQLite
猜你喜欢
  • 1970-01-01
  • 2011-05-26
  • 2012-02-12
  • 2023-03-16
  • 2011-04-30
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
相关资源
最近更新 更多