我有DBManager
从数据库(sqlite文件)获取数据。所有其他查询都没问题,但这个查询似乎不起作用
-(NSArray *)readCountries{
NSLog(@"[DBManager] readCountries");
NSMutableArray *countriesArray = [[NSMutableArray alloc] init];
//open db from users filesystem
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
const char* sql = "SELECT DISTINCT country FROM aed ORDER BY rowid";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
//loop through results
while (sqlite3_step(statement) == SQLITE_ROW) {
//read data from record
NSString *_country;
char* tmpCountry = (char*)sqlite3_column_text(statement, 1);
NSLog(@"tmpCountry = %@", [NSString stringWithUTF8String:tmpCountry]);
if (tmpCountry != NULL) {
_country = [NSString stringWithUTF8String:tmpCountry];
}else{
_country = @"n/a";
}
NSLog(@"country = %@", _country);
[countriesArray addObject:_country];
}
}
//finalize statement
sqlite3_finalize(statement);
}
//close database
sqlite3_close(database);
NSLog(@"[DBManager] countriesArray has %d objects", [countriesArray count]);
return (NSArray*)countriesArray;
}
我从日志中得到的,我的数组有5个对象,这很好 - 但它不仅仅是“不适用”......任何想法?其他查询都很好,他们大多使用sqlite3_column_text
所以我不明白,为什么它不在这里工作 - 也许一个新的眼睛会有所帮助。
答案 0 :(得分:1)
这与sqlite
C-api的混淆不一致。使用sqlite3_column_xxx
函数时,列索引从0开始。但是使用sqlite3_bind_xxx
函数,列索引是从1开始的。
改变这个:
char* tmpCountry = (char*)sqlite3_column_text(statement, 1);
为:
char* tmpCountry = (char*)sqlite3_column_text(statement, 0);
顺便说一句 - 您应该在else
和sqlite3_open
来电中添加sqlite3_prepare
语句。如果失败,您可以使用sqlite3_errmsg
功能记录错误。