2014-01-22 3 views
0

Мне нужно проверить временную метку в таблице базы данных SQLite с меткой времени, которую я имею в качестве переменной. Когда я запускаю инструкцию select для своей таблицы, мне кажется, что отсутствует первая запись.Результат запроса SQLite отсутствует Первая строка

lastMod = dict[@"LastMod"]; 
[self openDB]; 
NSString *sqlQuery = [NSString stringWithFormat:@"SELECT LastMod FROM %@ order by Lastmod desc", newTableName]; 

const char *sqlQueryChars = [sqlQuery cStringUsingEncoding:[NSString defaultCStringEncoding]]; 

sqlite3_stmt *statementChk; 

sqlite3_prepare_v2(congressDB, sqlQueryChars, -1, &statementChk, NULL); 

if (sqlite3_step(statementChk) == SQLITE_ERROR){ 

    NSAssert1(0, @"Error: %s", sqlite3_errmsg(congressDB)); 
    sqlite3_close(congressDB); 

} else { 

    if (sqlite3_step(statementChk) == SQLITE_ROW) { 

     NSString *resultString = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statementChk, 0)]; 
     NSNumberFormatter *resultNumberFormatter = [[NSNumberFormatter alloc] init]; 
     [resultNumberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
     NSNumber *resultNumber = [resultNumberFormatter numberFromString:resultString]; 

     if (resultNumber){ 

      if ([lastMod integerValue] > [resultNumber integerValue]) { 

       needsUpdating = @"YES"; 

      } else { 

       needsUpdating = @"NO"; 

      } 

     } 

    } else { 

     needsUpdating = @"YES"; // No rows found, table is empty and needs filling 

} 

Новейшие записи в базе данных являются:

1390393860 
1390385996 
1390385681 
... 

Тот, который я хочу, и я ожидаю это вершина одна - 1390393860, самое большое число (это новейший рекорд). Но я получаю второе 1390385996. Если изменить запрос:

NSString *sqlQuery = [NSString stringWithFormat:@"SELECT LastMod FROM %@ order by Lastmod desc limit 1", newTableName]; 

Программа говорит, что никакие строки не были возвращены. Тестирование этого запроса непосредственно в базе данных возвращает правильную строку. Что происходит?

Спасибо.

ответ

0

Это потому вы называете sqlite_step() дважды:

if (sqlite3_step(statementChk) == SQLITE_ERROR){ 

    NSAssert1(0, @"Error: %s", sqlite3_errmsg(congressDB)); 
    sqlite3_close(congressDB); 

} else { 

    if (sqlite3_step(statementChk) == SQLITE_ROW) { 

Когда вы должны использовать последний звонок только:

if (sqlite3_step(statementChk) == SQLITE_ROW) { 

(вы хотите, чтобы выбрать следующую строку и реагировать только, если есть ошибка).

+0

Это именно то, что проблема, глупая ошибка. Спасибо за вашу помощь, очень ценим! – Ryan

Смежные вопросы