2010-02-27 8 views
1

J'ai NSTableView avec deux colonnes, et je veux les remplir des entrées de la base de données SQLite.Lire le problème SQLite

cette méthode est de faire requête pour la 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); 
} 

le problème appers dans la méthode 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; 
} 

comment puis-je écrire des entrées "âge" dans NSMutableArray * âges, si je peux attribuer * contexte juste pour un NSMutableArray? (dans ce code, ceci est NSMutableArray * personne)

Sûrement je devrais créer une méthode séparée pour obtenir des entrées d'âge?

merci.

+4

Pourquoi avez-vous besoin de ceux dans 2 baies distinctes? Créez simplement une sous-classe 'NSObject' avec une propriété name et age (encore plus probablement), et ajoutez des instances de cette sous-classe à un seul' NSMutableArray'. Ensuite, vous ne devez pas déranger avec tous ces problèmes. – Joost

+0

peut-être que vous avez un petit exemple de projet? – nukl

+0

cru3l: Ce dont parle JoostK s'appelle un objet modèle. Apple a un guide pour les faire: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ModelObjects/ Un tableau parallèle, qui est ce que votre code essaie de créer, est presque toujours dans le mauvais sens faire quelque chose dans Cocoa, et dans ce cas, il s'avère que c'est aussi une mauvaise façon de le faire dans SQLite. –

Répondre

1

Dans beaucoup cas simples comme celui dans votre question il est pratique d'utiliser la représentation la plus naturelle des tables dans l'objectif-c: tableau de dictionnaires. La table est une collection indexée d'enregistrements - c'est donc un tableau, et chaque enregistrement est une collection de paires clé-valeur - donc c'est un dictionnaire. Et vous n'avez pas besoin de changer votre code lorsque vous changez les noms des colonnes ou même le nombre de colonnes.

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