Мне нужно проверить временную метку в таблице базы данных SQLite на временную метку, которая у меня есть как переменная. Когда я запускаю инструкцию select для своей таблицы, мне кажется, что отсутствует первая запись.
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];
Программа говорит, что строки не были возвращены. Тестирование этого запроса непосредственно в базе данных возвращает правильную строку. Что происходит?
Благодарю.
sqlite_step()
вы дважды вызываете 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) {
(вы хотите получить следующую строку и отреагировать, только если есть ошибка).