2010-02-28 12 views
1

Bon, bien sûr, c'est possible, ce n'est pas un problème. Dans mon code, j'ai plusieurs objets avec lesquels je travaille, et ils doivent être persistants. Pour ce faire, j'ai utilisé l'encodage d'objets et les stocker dans un fichier de données. Tels que:Est-il possible de stocker plusieurs objets en utilisant l'archivage d'objets?

-(NSString *)dataFilePath 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    return [documentsDirectory stringByAppendingPathComponent:kFilename]; 
} 

Et puis plus loin dans une autre partie du code:

NSMutableData *data = [[NSMutableData alloc] init]; 
     NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
     NSLog(@"Test 4"); 
     [archiver encodeObject:playerTwo forKey:@"PlayerTwoObject"]; 
     [archiver encodeObject:singlePlayer forKey:@"SinglePlayer"]; 
     [archiver encodeObject:playerOne forKey:@"PlayerOneObject"]; 
     [archiver encodeObject:settings forKey:@"Settings"]; 


     [archiver finishEncoding]; 
     [data writeToFile:[self dataFilePath] atomically:YES]; 
     [singlePlayer release]; 
     [playerOne release]; 
     [playerTwo release]; 
     [settings release]; 

Et qui sauve les objets. Je sais que cela fonctionne, parce que je peux les sortir avec ce code:

unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:[[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]]]; 
    SettingsObject *settings = [unarchiver decodeObjectForKey:@"Settings"]; 
    Player *test = [unarchiver decodeObjectForKey:@"PlayerOneObject"]; 
    NSLog(@"Power On Settings Test: %d,%d", [settings playerOneStartingLife], [settings singlePlayerStartingLife]); 
    NSLog(@"Power On Player Test: %@,%d", [test name], [test life]); 

Cool! Alors maintenant je peux stocker mes objets et les lire. C'est donc là que le problème entre en jeu. Dans une classe différente, je sors l'un des objets que je stocke et je travaille avec. Pas tous, je n'en ai lu qu'un. Et puis je le sauvegarde à nouveau après avoir changé les paramètres. Mais je vous attaquerez seulement il:

NSMutableData *data = [[NSMutableData alloc] init]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
    [archiver encodeObject:singlePlayer forKey:@"SinglePlayer"]; 
    [archiver finishEncoding]; 
    [data writeToFile:[self dataFilePath] atomically:YES]; 
    [singlePlayer release]; 

Après que je l'ai fait, tout le reste des objets que j'ai stockés sont supprimés. Maintenant, je suis confus, parce que je pensais que je ne faisais que modifier la clé unique "SinglePlayer", mais apparemment, cela supprime le reste d'entre eux? Est-ce que c'est supposé arriver? J'ai eu quelques problèmes avec la libération de l'archiveur, cela affecterait-il du tout ... Je ne pense pas que ce serait le cas. Est-ce que quelqu'un a un aperçu de cela, parce que je ne veux pas avoir à sortir tous les objets et les ré-encoder si je veux seulement modifier l'un d'eux ...

Merci pour votre aide!

Répondre

3

Vous créez un nouvel archiveur avec un objet de données emtpy. Vous écrivez l'objet SinglePlayer dans les données, mais vous ne stockez pas le reste des données dans la même archive nouvellement créée. Pour ce faire, désarchivez toute l'archive précédemment stockée, puis ajustez l'objet SinglePlayer et archivez-le, puis enregistrez-le à nouveau.

+0

Ugggh, cela semble terriblement inefficace. Existe-t-il une meilleure façon de le faire? Peut-être devrais-je utiliser SQLite à la place? –

+0

Mieux vaut passer à Core Data puis. Les données de base sont supportées par SQLite mais peuvent être utilisées beaucoup plus facilement quand il s'agit d'objets et de relations. – Joost

+0

L'utilisation de Core Data ou de SQLite dépend entièrement de ce que vous essayez de faire et fait actuellement l'objet de nombreux débats. http://inessential.com/2010/02/26/on_switching_away_from_core_data De même, Core Data peut utiliser SQLite comme type de magasin, mais il n'est pas plus "sauvegardé" par SQLite que n'importe quel autre type de magasin (tel que XML, binaire, ou un type de magasin personnalisé). –