2015-10-14 6 views
0

J'ai cherché et n'ai pas trouvé beaucoup de choses concernant la création d'une sauvegarde et la restauration d'un fichier de base de données, donc j'espère que quelqu'un plus intelligent que moi peut me diriger dans la bonne direction.Coredata: Sauvegarde et restauration d'un fichier de base de données

Ceci est sur OSX.

J'ai réussi à créer une sauvegarde, la restauration a été le principal problème. Cependant, je suis presque là, j'ai réussi à restaurer un fichier de base de données mais j'ai besoin de redémarrer l'application pour que cela fonctionne.

méthode de restauration:

[_managedObjectContext reset]; 
NSPersistentStore *currentStore = self.persistentStoreCoordinator.persistentStores.lastObject; 
[_persistentStoreCoordinator removePersistentStore:currentStore error:&error]; 
NSFileManager *filemanager; 
filemanager = [NSFileManager defaultManager]; 
if ([filemanager fileExistsAtPath:[url path]]) { 
    //If the file exist, remove file 
    if ([filemanager removeItemAtURL:url error:&error]) {} 
} 
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:urlbackup options:nil error:&error]; 
currentStore = self.persistentStoreCoordinator.persistentStores.lastObject; 

[_persistentStoreCoordinator migratePersistentStore:currentStore toURL:url options:options withType:NSSQLiteStoreType error:&error]; 

que tous les travaux, SI je redémarre l'application. Comment puis-je le faire fonctionner sans redémarrer l'application? Il semble que j'ai besoin de recharger toutes les données et actualiser la vue.

J'ai essayé, après sans succès:

[arrayController rearrangeObjects]; 
[tableView reloadData]; 

Encore une fois, si je redémarre l'application, tout est très bien, le fichier de sauvegarde est restauré. Tout pointeur serait grandement apprécié.

+0

@ littleDrummerBoy: Avez-vous trouvé une solution? Je suis la même situation. – Bucket

+1

@Bucket: Désolé pour le commentaire tardif, voyagé beaucoup ces derniers temps. Est-il possible d'envoyer un message privé ici? Faites-moi savoir si vous avez toujours besoin d'aide. – littleDrummerBoy

Répondre

0

Vous souhaitez placer le code qui crée la pile de données de base dans un emplacement réutilisable, ce qui signifie qu'elle ne figure pas dans le délégué de l'application si tel est le cas actuellement. Vous devez également détruire les vues, ou au moins les références des contrôleurs de vue aux objets gérés, contextes, etc.

Maintenant, une fois cela fait, le propriétaire du contexte peut le détruire, le magasin persistant et le modèle , puis réexécutez le code de création de la pile. Après cela, vous pouvez recréer votre vue (ou passer le nouveau contexte/objet géré au VC).

Il s'agit simplement de réorganiser votre code afin qu'il soit réutilisable et de ne laisser aucune ancienne référence aux objets invalidés.

+0

Merci, je comprends ce que vous dites, mais pourrait prendre un peu de mise en œuvre. Sur ce projet, j'utilise le modèle XCodes et j'ai décidé de laisser toutes les choses coredata dans le délégué de l'application. Le reste du code est dans un contrôleur principal, et je n'ai pas actuellement un VC séparé non plus. On dirait un peu de recodage afin de réorganiser comme vous l'avez suggéré. – littleDrummerBoy

+0

Voilà ce dont j'avais besoin - merci. Déplacé la pile de données de base à mon contrôleur principal. Dans la méthode de restauration, pile détruite, fichiers remplacés avec sauvegardes, pile recréée et liens rétablis au contexte. – littleDrummerBoy