2010-01-28 9 views
3

Utilisation de Iphone SDK 3.1.2. J'enregistre quelques informations dans un fichier en utilisant l'objet NSKeyedArchiver. J'ai 4 clés. Je lis les données du fichier pour les 4 clés sur applicationDidFinshLaunching et réécrit dans le fichier (toutes les 4 clés) sur applicationDidTerminate. Aussi, lorsque l'utilisateur enregistre des informations, j'écris les données pour la clé en particulier.Fichier NSKeyedArchiver - perte de données

Dans le cas où il n'y a pas de fichier initialement, j'alloue un tableau pour la liste de compte, cela me permet d'ajouter des comptes à celui-ci.

Je rencontre des problèmes avec le fichier en perdant périodiquement les données enregistrées. Parfois, sa seule touche affectée, c'est-à-dire la liste des comptes, parfois c'est la liste des favoris. Il semble être exacerbé si je sauve seulement 1key par opposition à tous les 4. J'ai regardé le fichier using organsier et en effet les données sont manquantes. La chose est plusieurs fois cela ne fonctionne pas. Je ne sais pas pourquoi c'est si incohérent. Aussi, si je termintate le débogueur dans xcode, je m'attendrais à ne perdre que les changements récents et non les données de fichiers entières qui semblent se produire. Toute la chose NSKeyedArchiv er semble si flakey im considérant peut-être une autre stratégie persistante de stockage. Tout le monde rencontre quelque chose comme ça.

- (void)viewDidLoad 
{ 

if(self.accountList == nil) 
{ 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
    self.accountList = array; 
    [array release]; 
} 

if(self.phoneSettings == nil) 
{ 
PhoneSettings* mySettings = [[PhoneSettings alloc] initSettings]; 
self.phoneSettings = mySettings; 
[mySettings release]; 
} 



NSString *filePath = [self dataFilePath]; 
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { 
    NSData *data = [[NSMutableData alloc] 
        initWithContentsOfFile:[self dataFilePath]]; 
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] 
            initForReadingWithData:data]; 
    NSMutableArray *archiveArray = [unarchiver decodeObjectForKey:kDataKey]; 
if(archiveArray != nil) 
    self.accountList = [archiveArray retain]; 
else 
    LOG("No archived accounts"); 

NSMutableArray *archiveCallList = [unarchiver decodeObjectForKey:kCallListKey]; 
    if(archiveCallList !=nil) 
    appDelegate.callList = [archiveCallList retain]; 

    NSMutableArray *archiveFavouritesList = [unarchiver decodeObjectForKey:kfavouritesKey]; 
    if(archiveFavouritesList != nil) 
    appDelegate.favouritesList = [archiveFavouritesList retain]; 

    PhoneSettings* archiveSettings = [unarchiver decodeObjectForKey:kPhoneSettings]; 
    if (archiveSettings != nil) 
    self.phoneSettings = [archiveSettings retain]; 

    [unarchiver finishDecoding];   
    [unarchiver release]; 
    [data release]; 
} 

puis dans

- (void)applicationWillTerminate:(NSNotification *)notification { 

LOG("Application terminating"); 
SessionTalkAppDelegate* appDelegate = (SessionTalkAppDelegate*)[[UIApplication sharedApplication] delegate]; 




NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] 
          initForWritingWithMutableData:data]; 
[archiver encodeObject:self.accountList forKey:kDataKey]; 
[archiver encodeObject:appDelegate.callList forKey:kCallListKey]; 
[archiver encodeObject:appDelegate.favouritesList forKey:kfavouritesKey]; 
[archiver encodeObject:self.phoneSettings forKey:kPhoneSettings]; 
[archiver finishEncoding]; 

[data writeToFile:[self dataFilePath] atomically:YES]; 
    [archiver release]; 
[data release];  
} 

Répondre

4

Vous n'avez pas besoin beaucoup de code. Enregistrez vos données:

NSMutableDictionary *appState = [NSMutableDictionary dictionary]; 
[appState setObject: self.accountList forKey: kDataKey]; 
[appState setObject: appDelegate.callList forKey: kCallListKey]; 
[appState setObject: self.phoneSettings forKey: kPhoneSettings]; 
if ([NSKeyedArchiver archiveRootObject: appState toFile: [self dataFilePath]] == NO) 
    NSLog(@"Failed to archive %@", appState); 

Lire les données:

NSMutableDictionary *appState = [NSKeyedUnarchiver unarchiveObjectWithFile: [self dataFilePath]]; 

Notez que NSKeyedUnarchiver peut soulever une NSInvalidArgumentException si le fichier ne contient pas une archive valide, vous devez donc joindre l'appel dans un @try { } bloquer.

+0

Salut, merci, mais qu'en est-il des autres clés, le code ci-dessus a seulement archivé les listes de comptes, j'ai 3 autres listes. Que puis-je faire avec eux Merci encore – tech74

+0

Généralement, vous créez un NSDictionary (ou NSMutableDictionary) contenant les données que vous souhaitez enregistrer. Ensuite, vous passez le dictionnaire en tant qu'objet racine à NSKeyedArchiver et vous le récupérez à partir de NSKeyedUnarchiver. J'ai corrigé la réponse affichée ci-dessus. – Costique

+0

Merci, si je dis que je veux juste enregistrer une clé, dites la liste d'appels au cours de l'application lorsque l'utilisateur touche enregistrer, est le suivant ok: NSMutableDictionary * appState = [NSMutableDictionary dictionnaire]; [appState setObject: appDelegate.callList forKey: kCallListKey]; if ([NSKeyedArchiver archiveRootObject: appState auFichier: [self dataFilePath]] == NO) NSLog (@ "Impossible d'archiver% @", appState); – tech74

Questions connexes