我有一个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个对象,这很好-但是它不只是“ n / a” ...什么主意吗?其他查询也很好,它们大多使用sqlite3_column_text,所以我不明白为什么它在这里不起作用-也许换个角度看看会有所帮助。

最佳答案

这是与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);


顺便说一句-您应该在elsesqlite3_open调用中添加sqlite3_prepare语句。如果它们失败,则可以使用sqlite3_errmsg函数记录错误。

关于ios - SQLite数据库无法读取列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17799019/

10-16 11:09
查看更多