2012-10-19 4 views
3

Hya.FMDB lastinsertRowID toujours 0

J'ai implémenté FMDB dans mon application. Je suis en train d'obtenir le dernier ID de ligne d'un de mes bases de données avec ce

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

le problème est que j'ai lastId est toujours 0, bien qu'il y ait 3 entrées actuellement dans la base de données. Any1 a une idée de pourquoi cela se passe-t-il?

EDIT: la base de données est créée comme ceci:

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

Répondre

4

lastInsertRowId fonctionne sur une connexion spécifique. La connexion que vous utilisez vient d'être ouverte. Il n'y a donc pas d'ID de ligne inséré.

(Le but de lastInsertRowId est de permettre à votre application de connaître l'ID d'un dossier qui vient d'être INSERT ed.)

Pour lire les données du dernier enregistrement, utilisez quelque chose comme ceci:

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

Aha! Merci pour ton explication. Mais en supposant que je n'utiliserais pas l'API FMDB mais SQLITE, select_last_row_id() se comporterait-il de la même manière? –

+0

Oui; C'est ainsi que 'lastInsertRowId' est implémenté. –

+0

alors comment une requête INSERT sait-elle insérer une ligne dans un rowid correspondant? Je veux dire bien sûr, le rowid est réglé sur l'auto-incrémentation, mais dans un exemple supposé comme ceci: la base de données contient 3 items, avec les rowids 1,2 et 3. vous insérez un quatrième item; sql le met à rowid 4; alors vous supprimez la nouvelle ligne; après cela, vous faites un autre INSERT; la nouvelle ligne aura rowid 5, même si au moment du dernier INSERT, le max_rowid était 3. –