Sqlite - while(sqlite3_step(statement)== SQLITE_ROW)没有执行

时间:2014-05-19 09:58:29

标签: ios sqlite

我正在尝试在我的数据库中的Points列中获取最高值,但是sqlite_step语句永远不会被执行。 这是其中的方法。

+(NSMutableArray*)getMax {
[self databaseInit];
highScore *newMax = [[highScore alloc]init];
NSMutableArray *maxPointsArray = [[NSMutableArray alloc]init];
if (sqlite3_open(dbpath,&peopleDB)==SQLITE_OK)
{
    NSString *selectMaxSQL = [NSString stringWithFormat:@"SELECT MAX POINTS FROM PEOPLE"];
    if(sqlite3_prepare_v2(peopleDB, [selectMaxSQL UTF8String],-1,&statement, NULL)==SQLITE_OK){
        while (sqlite3_step(statement) == SQLITE_ROW){
            newMax.max = sqlite3_column_int(statement, 0);

        }
        [maxPointsArray addObject:newMax];
    }
}
sqlite3_finalize(statement);
sqlite3_close(peopleDB);
return maxPointsArray;
}

如果它有所不同,则databaseInit方法为 -

+(void)databaseInit {
//get documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths [0];
//create path to database file
databasePath = [[NSString alloc]initWithString:[docsDir stringByAppendingPathComponent:@"people.db"]];
dbpath = [databasePath UTF8String];
}

非常感谢任何帮助,如果需要更多代码,请告诉我。

2 个答案:

答案 0 :(得分:0)

由于您的查询错误,因此未执行。

假设pointspeople表的字段,则查询应为:

SELECT MAX(points) FROM people

答案 1 :(得分:0)

您可以立即得到答案,但长期解决方案是在任何SQLite函数失败时记录sqlite3_errmsg。编写代码的方式,您无法知道哪些调用失败以及原因。

因此,您可能需要:

+(NSMutableArray*)getMax {
    int rc;

    [self databaseInit];
    highScore *newMax = [[highScore alloc]init];
    NSMutableArray *maxPointsArray = [[NSMutableArray alloc]init];
    if ((rc = sqlite3_open(dbpath, &peopleDB)) == SQLITE_OK) {
        const char *selectMaxSQL = "SELECT MAX(POINTS) FROM PEOPLE";
        if(sqlite3_prepare_v2(peopleDB, selectMaxSQL, -1, &statement, NULL)==SQLITE_OK){
            if ((rc = sqlite3_step(statement)) == SQLITE_ROW){
                newMax.max = sqlite3_column_int(statement, 0);
                [maxPointsArray addObject:newMax];
            } else {
                if (rc == SQLITE_DONE) {
                    NSLog(@"No record returned");
                } else {
                    NSLog(@"Step failed %s (%d)", sqlite3_errmsg(peopleDB), rc);
                }
            }
            sqlite3_finalize(statement);
        } else {
            NSLog(@"Prepare failed %s (%d)", sqlite3_errmsg(peopleDB), rc);
        }
    } else {
        NSLog(@"Open failed %d", rc);
    }
    sqlite3_close(peopleDB);
    return maxPointsArray;
}

如果您使用原始SQL执行此操作,则会准确报告SQL遇到错误的位置。此外,如果您将来遇到任何问题,这种防御性编程将有助于更快地诊断问题。

值得注意的是,通常建议不要在每次数据库调用时打开和关闭数据库,而是仅打开数据库一次。它更有效率,人们在不断打开和关闭数据库时报告了问题。