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