iPhone iOS: SQLite3 Не удалось получить последнее значение идентификатора в таблице - PullRequest
0 голосов
/ 26 августа 2011

Я пытался выяснить это почти весь день, и после нескольких попыток я решил, что у кого-нибудь есть идеи.Любая помощь приветствуется.

У меня есть довольно простая таблица идентификаторов и имен, и я хотел бы получить последнее значение идентификатора в таблице.

Хотя я не получаю никаких ошибок компиляцииили ошибки во время выполнения, я получаю неправильное значение для ID.Согласно SQLiteManager (который может напрямую проверять базу данных) мой максимальный идентификатор равен 10, однако независимо от того, что я делаю, я просто получаю значение 0 для PlayKey.

Вот определения:

//CREATE THE Plays TABLE
char *errorMsg;
NSString *createSQL = @"CREATE TABLE IF NOT EXISTS Plays (ID integer PRIMARY KEY AUTOINCREMENT,PlayName text);";
if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK){
    sqlite3_close(database);
    NSAssert1(0, @"Error creating table: %s", errorMsg);
}

и вот где я пытаюсь получить последний ID, который был вставлен в него:

NSString *query3 = [NSString stringWithFormat:@"SELECT MAX(ID) FROM Plays"];
sqlite3_stmt *statement3;
if (sqlite3_prepare_v2(database, [query3 UTF8String], -1, &statement3, nil) == SQLITE_OK) {
    PlayKey = sqlite3_column_int(statement3, 0);
    NSString* msg4 = [NSString stringWithFormat:@"This worked! The PlayKey was %d", PlayKey];
    NSLog(msg4);
}
if (sqlite3_step(statement3) !=SQLITE_DONE) {NSLog(@"Error inserting to Steps");}

Я также попытался сделать это, используя гораздо более простую встроенную функцию:

PlayKey = sqlite3_last_insert_rowid(database);

Обе эти попытки приводят к неправильному значению 0.

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

Вы также можете получить последний идентификатор любой таблицы через sqlite_sequence. EX-

+(int)getLastLocationId{
    NSString *sqlNsStr = [NSString stringWithFormat:@"SELECT * FROM sqlite_sequence where name='Location'"];
    const char *sql = [sqlNsStr cStringUsingEncoding:NSUTF8StringEncoding];
    int lastrec=0;
    //    if(sqlite3_open([dbPath UTF8String], &masterDB) == SQLITE_OK){
    if (sqlite3_prepare_v2(masterDB, sql, -1, &init_statement, NULL) == SQLITE_OK) {
        while(sqlite3_step(init_statement) == SQLITE_ROW) {
            lastrec = sqlite3_column_int(init_statement, 1);
        }
        sqlite3_reset(init_statement);
    }
    return lastrec;
}
0 голосов
/ 26 августа 2011

Это после самой первой вставки?Или у вас уже есть куча записей?ROWID начинается с 0, поэтому самая первая запись получает ROWID = 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...