3
내 응용 프로그램에서 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");
}
}
아하! 설명해 주셔서 감사합니다. 하지만 내가 FMDB하지만 SQLite API를 사용하지 않을 것이라고 가정한다면 select_last_row_id()는 비슷한 방식으로 동작할까요? –
예; 이것이 바로'lastInsertRowId'가 구현 된 방식입니다. –
그래서 어떻게 INSERT 쿼리가 해당 rowid에 행을 삽입하는 것을 알고 있습니까? 확실하게, ROWID는 autoincrement로 설정되어 있지만, 이렇게 가정 된 검사에서 : 데이터베이스에는 3 개의 항목, whith ROWID 1,2 및 3이 있습니다. 네 번째 항목을 삽입합니다. sql은 rowid 4에 놓는다; 그런 다음 새 행을 삭제합니다. 그 후에 다른 INSERT를 수행합니다. 마지막 INSERT 시점에 max_rowid가 3 이었지만 새 행은 rowid 5를 갖습니다. –