iPhone iOS: SQLite3 Not able to get last ID value in Table

雨燕双飞 提交于 2019-12-23 05:46:08

问题


I've been trying to figure this out for almost the whole day, and after several attempts, I figured I'd see if anyone here might have some ideas. Any help is welcome.

I have a pretty simple table of ID's and Name's and I would like to get the last ID value in the table.

Although I don't get any compile errors or run-time errors, I'm getting the wrong value for ID. According to SQLiteManager (which can directly check the database) my max ID is 10, however, no matter what I do I simply get a value of 0 for PlayKey.

Here's the definitions:

//CREATE THE Plays TABLE
char *errorMsg;
NSString *createSQL = @"CREATE TABLE IF NOT EXISTS Plays (ID integer PRIMARY KEY AUTOINCREMENT,PlayName text);";
if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK){
    sqlite3_close(database);
    NSAssert1(0, @"Error creating table: %s", errorMsg);
}

and here is where I try to get the last ID that was inserted into it:

NSString *query3 = [NSString stringWithFormat:@"SELECT MAX(ID) FROM Plays"];
sqlite3_stmt *statement3;
if (sqlite3_prepare_v2(database, [query3 UTF8String], -1, &statement3, nil) == SQLITE_OK) {
    PlayKey = sqlite3_column_int(statement3, 0);
    NSString* msg4 = [NSString stringWithFormat:@"This worked! The PlayKey was %d", PlayKey];
    NSLog(msg4);
}
if (sqlite3_step(statement3) !=SQLITE_DONE) {NSLog(@"Error inserting to Steps");}

I also tried to do this using a much simpler built in function:

PlayKey = sqlite3_last_insert_rowid(database);

Both these tries result in an incorrect value of 0.


回答1:


You also can retrieve the last ID of any table through sqlite_sequence. EX-

+(int)getLastLocationId{
    NSString *sqlNsStr = [NSString stringWithFormat:@"SELECT * FROM sqlite_sequence where name='Location'"];
    const char *sql = [sqlNsStr cStringUsingEncoding:NSUTF8StringEncoding];
    int lastrec=0;
    //    if(sqlite3_open([dbPath UTF8String], &masterDB) == SQLITE_OK){
    if (sqlite3_prepare_v2(masterDB, sql, -1, &init_statement, NULL) == SQLITE_OK) {
        while(sqlite3_step(init_statement) == SQLITE_ROW) {
            lastrec = sqlite3_column_int(init_statement, 1);
        }
        sqlite3_reset(init_statement);
    }
    return lastrec;
}



回答2:


Is this after very first insert? Or you have bunch of records already? ROWID starts with 0, so very first record gets ROWID=0.



来源:https://stackoverflow.com/questions/7199300/iphone-ios-sqlite3-not-able-to-get-last-id-value-in-table

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!