我正在尝试在我的数据库中的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];
}
非常感谢任何帮助,如果需要更多代码,请告诉我。
答案 0 :(得分:0)
由于您的查询错误,因此未执行。
假设points
是people
表的字段,则查询应为:
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遇到错误的位置。此外,如果您将来遇到任何问题,这种防御性编程将有助于更快地诊断问题。
值得注意的是,通常建议不要在每次数据库调用时打开和关闭数据库,而是仅打开数据库一次。它更有效率,人们在不断打开和关闭数据库时报告了问题。