2012-10-19 3 views
3

Hya.FMDB lastinsertRowID 항상 0

내 응용 프로그램에서 FMDB를 구현했습니다. 데이터베이스에 3 개 항목이 현재이 있지만 나는 내가 가지고있는 문제가 lastId은 항상 0이다이

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]; 
     } 
    } 

내 데이터베이스 중 하나에서 마지막 행 ID를 얻기 위해 노력하고 있어요. 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는 autoincrement로 설정되어 있지만, 이렇게 가정 된 검사에서 : 데이터베이스에는 3 개의 항목, whith ROWID 1,2 및 3이 있습니다. 네 번째 항목을 삽입합니다. sql은 rowid 4에 놓는다; 그런 다음 새 행을 삭제합니다. 그 후에 다른 INSERT를 수행합니다. 마지막 INSERT 시점에 max_rowid가 3 이었지만 새 행은 rowid 5를 갖습니다. –