如何在PhoneGap安卓中从SQLite获取最后插入的行ID

6

我正在创建一个应用程序,在其中插入表中的数据。在将数据插入表后,我希望获得该行的ID,以便根据它进行进一步操作。 我尝试使用sqlite的last_insert_rowid()函数,但没有成功。 有人能告诉我获取最后插入的行ID的最佳方法吗? 感谢您的提前阅读。


last_insert_rowid() 应该已经起作用了。你的插入操作成功了吗? - SHANK
希望您正在使用正确的查询SELECT last_insert_rowid()。不要包括表名。 - SHANK
我可能会用错,你能给我一个例子并告诉我如何将结果传递给变量吗? - Neerav Shah
2个回答

8
你可以使用以下方法获取最后插入表中的ID -
tx.executeSql("INSERT INTO profile('name','label','list_order','category') values(?,?,?,?)", 
    [currentProfile.name, currentProfile.label, currentProfile.list_order, currentProfile.category], 
    function(tx, results){
        var lastInsertId = results.insertId; // this is the id of the insert just performed
    }, 
    failCB
)

WebSQL 中的 results.insertId 类似于 MySQL 中的 mysql_insert_id() -

mysql_query("INSERT INTO mytable (product) values ('kossu')");
printf("Last inserted record has id %d\n", mysql_insert_id());

正是我想要的。你知道我怎么能够从这个结果集中获取刚插入的行数据吗? - Neil
@Neil 在上面的示例中,您可以引用 currentProfile 对象。我想在您的情况下,您可能会将其放在循环内部。在这种情况下,您可以将 tx.executeSql 包装在闭包中,以便它保持对 currentProfile 对象的范围。 - Ross
很遗憾,我的情况不是在for循环中。但数据是从所有文本框对象中检索出来的。问题是有大约20个文本框对象,希望有一种简单的方法可以从结果集中获取已设置所有属性的资源对象。因为我将在成功事件中创建的对象传递,并将其传递到查看页面。 - Neil

1

你的表中是否有名为rowid、oid或_rowid_的列?如果有,那么使用last_insert_rowid()时会出现问题。请参见这里

解决方法: 如果你有一个自动递增的ID列,你可以使用以下SQL语句来获取最后一个条目。

SELECT * FROM yourTable ORDER BY yourIdColumn DESC LIMIT 1

"

这可能有点粗糙,但它可以工作。

"

如果您还从数据库中删除记录,则此方法将无法起作用。新纪录会取代已删除记录的ID号码。 - sga4

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