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");
}
}
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? –
Oui; C'est ainsi que 'lastInsertRowId' est implémenté. –
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. –