Réinitialiser un magasin persistant CoreData

Fondamentalement, ce que j'essaie de faire est d'effacer toutes les données de mon CoreData magasin persistant, puis importer de nouvelles données. Comment voulez-vous faire cela? Il semble que la solution la plus simple est d'appeler [NSPersistentStoreCoordinator removePersistentStore:error:] et ensuite supprimer le fichier. C'est que les meilleures pratiques disponibles? C'est thread-safe?

Merci beaucoup,

#

Question 0.1: a

Je suis en train de mettre à jour les données dans un CoreData magasin persistant. Mon utilisateur est de voir une vue de la table des données statistiques. Je veux mettre à jour l'application, par la suppression de toutes les données existantes, puis d'importer de nouvelles données. Je voudrais montrer un progrès en vue d'indiquer à l'utilisateur que l'application n'est pas suspendu.

J'ai ajouté ce qui suit resetPersistentStore méthode dans mon AppDelegate (persistentStoreCoordinatorest donnée à titre indicatif):

//...
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
//...

/**
 Returns the persistent store coordinator for the application.
 If the coordinator doesn't already exist, it is created and the application's store added to it.
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: kPersistentStoreFilename]];

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator;
}

/**
 * Will remove the persistent store
 */
- (NSPersistentStoreCoordinator *)resetPersistentStore {
    NSError *error;

    [managedObjectContext lock];

    //FIXME: dirty. If there are many stores...
    NSPersistentStore *store = [[persistentStoreCoordinator persistentStores] objectAtIndex:0];

    if (![persistentStoreCoordinator removePersistentStore:store error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }  

    //Delete file
    if (![[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    } 

    //Delete the reference to non-existing store
    [persistentStoreCoordinator release];
    persistentStoreCoordinator = nil;

    NSPersistentStoreCoordinator *r = [self persistentStoreCoordinator];
    [managedObjectContext unlock];

    return r;
}

Alors à mon avis je n' (dans un autre thread depuis que je suis en utilisant MBProgressHUD:

PatrimoineAppDelegate *appDelegate = (PatrimoineAppDelegate *)[[UIApplication sharedApplication] delegate]; 
//Delete everything
[appDelegate resetPersistentStore];

Et je reçois un EXC_BAD_ACESS...

Je ne sais pas CoreData ou le multithreading très bien, peut-être que je suis en train de faire une erreur évidente...

source d'informationauteur