阅读SQLite问题

时间:2010-02-27 19:09:22

标签: objective-c cocoa sqlite

我有两列NSTableView,我想从SQLite数据库填充它们。

此方法是查询表

-(void)getPersons
{

    NSString *file = [[NSBundle mainBundle] pathForResource:@"persons" ofType:@"db"];
    sqlite3 *database = NULL;
    if (sqlite3_open([file UTF8String], &database)==SQLITE_OK)
    {
        NSLog(@"i open database");
        sqlite3_exec(database, "select name,age from persons", MyCallback, persons, NULL);

    }
    sqlite3_close(database);
}

问题出现在MyCallback方法中:

static int MyCallback(void *context, int count, char **values, char **columns)
{
    NSMutableArray *persons = (NSMutableArray *)context;

    for (int i=0; i < count; i++) {

        NSString *columnname = [NSString stringWithUTF8String:columns[i]];
        const char *nameCString = values[i];

            if ([columnname isEqualTo:@"name"]) {
                [persons addObject:[NSString stringWithUTF8String:nameCString]];
            }
        else {
            [ages addObject:[NSString stringWithUTF8String:nameCString]];
        }

    }
    return SQLITE_OK;
}

如果我可以为一个NSMutableArray分配*上下文,我如何将“年龄”条目写入NSMutableArray *年龄? (在此代码中,这是NSMutableArray * person)

当然,我应该为获取年龄条目创建一个单独的方法吗?

感谢。

1 个答案:

答案 0 :(得分:1)

在许多简单的情况中,就像你的问题中那样,在objective-c:dictionaries数组中使用表的最自然表示是很方便的。表是索引的记录集合 - 因此它是一个数组,每个记录都是键值对的集合 - 所以它是一个字典。当您更改列名称甚至列数时,您无需更改代码。

...
NSMutableArray *allRecords= (NSMutableArray *)context;
NSString *columnName;
NSString *columnValue;
NSMutableDictionary * record = [NSMutableDictionary dictionary];
for (int i=0; i < count; i++) {
  columnName = [NSString stringWithUTF8String:columns[i]];
  if (values[i]){
    columnValue = [NSString stringWithUTF8String:values[i]];
  }
  else{
    columnValue = @"";
  }
  [record setObject:columnValue forKey:columnName]; 
}
[allRecords addObject:record];
...