SQLite查询结果缺少第一行

时间:2014-01-22 15:36:14

标签: objective-c cocoa-touch sqlite

我需要根据我作为变量的时间戳检查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]; 

程序说没有返回任何行。直接在数据库上测试此查询将返回正确的行。发生了什么事?

感谢。

1 个答案:

答案 0 :(得分: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) {

(您想要获取下一行并仅在出现错误时做出反应)。