2011-08-26 48 views
0

我幾乎一整天都在想這個問題,經過多次嘗試,我想我會看看這裏有沒有人可能有一些想法。歡迎任何幫助。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的值不正確。

回答

2

您還可以通過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

0

這是在第一次插入後?或者你已經有一堆記錄了? ROWID從0開始,所以第一個記錄的ROWID = 0。

+0

不,我已經有一堆記錄。根據單獨的應用程序(SQLite Manager),正確的ROWID應該是10。即使我立即輸入多個記錄,我仍然只得到0. – USS1994

+0

我剛剛注意到您自己創建了ID字段。爲什麼?每行將有自動創建的字段ROWID。您可以通過直接指定來訪問:'選擇ROWID,* from TABLE'。這個ROWID應該由'sqlite3_last_insert_rowid'返回 – sha