3

ひゃー。

アプリに FMDB を実装しました。これを使用して、データベースの1つから最後の行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];
        }
    }

私が抱えている問題は、現在データベースに 3 つのエントリがあるにもかかわらず、 lastId が常に 0 であることです。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

1 に答える 1

6

lastInsertRowId特定の接続で動作します。使用している接続は開かれたばかりなので、挿入された行 ID はありません。

(の目的は、編集lastInsertRowIdされたばかりのレコードの ID をアプリが認識できるようにすることです。)INSERT

最後のレコードからデータを読み取るには、次のようなものを使用します。

SELECT budget FROM data WHERE rowid = (SELECT max(rowid) FROM data)
于 2012-10-19T15:36:33.113 に答える