2012-10-19 131 views
3

Hya。FMDB lastinsertROWID始終爲0

我在我的應用程序中實現了FMDB。我想從我的數據庫之一的最後一行ID與此

FMDatabase *bdb=[FMDatabase databaseWithPath:databasePath]; 
    NSString *str; 
    if([bdb open]){ 
     int lastId=[bdb lastInsertRowId]; 
     FMResultSet *s = [bdb executeQuery:[NSString stringWithFormat:@"SELECT budget FROM data WHERE ROWID='%d'",lastId]]; 
     if([s next]) 
     { 
      str= [s stringForColumnIndex:0]; 
     } 
    } 

我的問題是,lastId始終爲0,雖然目前有3項在數據庫中。 Any1有任何想法爲什麼會發生這種情況?

編輯:數據庫是這樣創建的:一個特定連接

NSFileManager *filemgr = [NSFileManager defaultManager]; 
    if ([filemgr fileExistsAtPath: databasePath ] == NO) 
    { 
     const char *dbpath = [databasePath UTF8String]; 

     if (sqlite3_open(dbpath, &basicDB) == SQLITE_OK) 
     { 
      char *errMsg; 
      const char *sql_stmt = "CREATE TABLE IF NOT EXISTS DATA (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, BUDGET INTEGER)"; 

      if (sqlite3_exec(basicDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) 
      { 
       DLog(@"Failed to create table"); 
      } 
      sqlite3_close(basicDB); 

     } else { 
      DLog(@"Failed to open/create database"); 
     } 
    } 

回答

4

lastInsertRowId作品。 您正在使用的連接剛打開,因此沒有插入的行ID。

(的lastInsertRowId的目的是爲了讓你的應用就會知道剛剛INSERT編創紀錄的ID)。

從最後一個記錄中讀取數據,使用這樣的:

SELECT budget FROM data WHERE rowid = (SELECT max(rowid) FROM data) 
+0

啊哈!謝謝你的解釋。但假設我不會使用FMDB但是SQLITE API,select_last_row_id()會以類似的方式運行嗎? –

+0

是的;這就是'lastInsertRowId'的實現方式。 –

+0

那麼INSERT查詢如何知道在相應的rowid中插入一行?我的意思是肯定的,rowid被設置爲自動增量,但在這樣的假設檢查:數據庫包含3個項目,whith rowids 1,2和3.您插入第四項; sql把它放在rowid 4;那麼你刪除了新的一行;之後你做另一個INSERT;新行將有rowid 5,即使在最後一次INSERT時,max_rowid也是3. –