Best way to get the ID of the last inserted row on SQLite
Asked Answered
S

4

29

On iPhone, what's the best way to get the ID of the last inserted row on an SQLite Database using FMDB ?

Is there a better way rather than doing :

SELECT MAX(ID)
Sibilla answered 3/5, 2011 at 9:11 Comment(0)
G
66

If you can guarantee that your ID column is an auto-increment column, MAX(ID) is fine.

But to cover any case, there's a specialized SQLite function called LAST_INSERT_ROWID():

SELECT LAST_INSERT_ROWID();

In FMDB, you use the -lastInsertRowId method (which internally runs the above):

int lastId = [fmdb lastInsertRowId];
Ginglymus answered 3/5, 2011 at 9:13 Comment(3)
Why [fmdb lastInsertRowId] always returns 0 for me?Loaded
@Loaded lastInsertRowId works on a specific connection. The connection that you're using has just been opened, so there is no inserted row ID. You can reference this answer for more information.Candlewood
I found that LAST_INSERT_ROWID() is connection specific. So if you're opening/closing your connection it won't work the way you might expect.Complacency
C
9

The function sqlite3_last_insert_rowid() is what you're looking for. Having just checked out the source code for FMDB, there seems to be a method on FMDatabase called -lastInsertRowId that wraps the function.

Cautery answered 3/5, 2011 at 10:39 Comment(1)
@FMDatabase link does not existsTawnytawnya
N
5

For swift 5 use this code

let lastRowId = sqlite3_last_insert_rowid(db)

for example

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
Nylon answered 4/8, 2019 at 6:43 Comment(0)
F
1

Try the following:

var rowid: Int = Int(contactDB.lastInsertRowId())
Foothill answered 1/8, 2015 at 7:22 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.