在iPhone上,使用FMDB获取SQLite数据库中最后插入行的ID,最好的方法是什么?
除了执行以下操作外,是否有更好的方法:
SELECT MAX(ID)
在iPhone上,使用FMDB获取SQLite数据库中最后插入行的ID,最好的方法是什么?
除了执行以下操作外,是否有更好的方法:
SELECT MAX(ID)
如果你可以保证你的ID
列是自动递增的,那么使用MAX(ID)
就可以了。
但为了覆盖任何情况,SQLite有一个专门的函数叫做LAST_INSERT_ROWID()
:
SELECT LAST_INSERT_ROWID();
在FMDB中,你可以使用-lastInsertRowId
方法(内部运行上述代码):
int lastId = [fmdb lastInsertRowId];
你要找的是函数sqlite3_last_insert_rowid()。刚刚检查了FMDB的源代码,似乎有一个方法在FMDatabase上叫做-lastInsertRowId
,它包装了这个函数。
对于Swift 5,请使用以下代码
let lastRowId = sqlite3_last_insert_rowid(db)
if sqlite3_exec(db, stringSql, nil, nil, nil) != SQLITE_OK {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("error Insert: \(errmsg)")
}
let lastRowId = sqlite3_last_insert_rowid(db);
print(lastRowId) // its gives you last insert id
if sqlite3_finalize(statement) != SQLITE_OK {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("error finalizing prepared statement: \(errmsg)")
}
statement = nil
//*** close data base
if sqlite3_close(db) != SQLITE_OK {
print("error closing database")
}
db = nil
var rowid: Int = Int(contactDB.lastInsertRowId())
lastInsertRowId
只在特定的连接上起作用。你正在使用的连接刚刚被打开,因此没有插入行 ID。你可以参考这个答案获取更多信息。 - BernardLAST_INSERT_ROWID()
是与连接相关的。因此,如果您正在打开/关闭连接,则它不会按照您的预期工作。 - Elijah W. Gagne