views:

74

answers:

1

I have NSTableView with two columns, and i wanna fill them entries from SQLite database.

this method is make query for table

-(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);
}

the problem appers in MyCallback method:

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;
}

how can i write "age" entries into NSMutableArray *ages, if i can assign *context just for one NSMutableArray? (in this code, this is NSMutableArray *person)

Surely i should create a separate method for get age entries?

thanks.

A: 

In many simple cases like the one in your question it is convinient use most natural representation of tables in objective-c: array of dictionaries. Table is indexed collection of records - so it is an array, and each record is collection of key-value pairs - so it is a dictionary. And you need not change you code when you change column names or even number of colums.

...
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];
...
Vladimir