iPhone iOS:SQLite3无法获取表中的最后一个ID值

iPhone iOS:SQLite3无法获取表中的最后一个ID值

问题描述:

我几乎一整天都在想这个问题,经过多次尝试,我想我会看看这里有没有人可能有一些想法。欢迎任何帮助。iPhone iOS:SQLite3无法获取表中的最后一个ID值

我有一个非常简单的ID和Name的表,我想获得表中的最后一个ID值。

尽管我没有收到任何编译错误或运行时错误,但我得到了错误的ID值。根据SQLiteManager(它可以直接检查数据库),我的最大ID是10,但是,不管我做什么,我只是得到PlayKey的值为0。

这里的定义:

//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); 
} 

和这里就是我试图获取插入它的最后一个ID:使用一个更简单的内置

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");} 

我也试图做到这一点in功能:

PlayKey = sqlite3_last_insert_rowid(database); 

这两个尝试都会导致0的值不正确。

您还可以通过sqlite_sequence检索任何表的最后一个ID。 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; 
} 
+0

啊,我明白了。谢谢!可能不是最有效的方法,但它有正确的ID! – USS1994

这是在第一次插入后?或者你已经有一堆记录了? ROWID从0开始,所以第一个记录的ROWID = 0。

+0

不,我已经有一堆记录。根据单独的应用程序(SQLite Manager),正确的ROWID应该是10。即使我立即输入多个记录,我仍然只得到0. – USS1994

+0

我刚刚注意到您自己创建了ID字段。为什么?每行将有自动创建的字段ROWID。您可以通过直接指定来访问:'选择ROWID,* from TABLE'。这个ROWID应该由'sqlite3_last_insert_rowid'返回 – sha