Comment supprimer tous les objects de mon magasin persistant dans datatables de base?

J'ai des données de base fonctionnant dans mon application. Ainsi, je récupère un file XML, j'parsing datatables dans des objects templates et les insère dans datatables de base. Ils sont enregistrés dans le magasin persistant et je peux y accéder lorsque je relance l'application. Cependant, je veux être en mesure d'actualiser datatables dans le magasin persistant à volonté, donc je dois d'abord supprimer les objects existants du magasin. Existe-t-il une méthode simple pour cela?

Merci


J'ai trouvé cette solution:

[managedObjectContext lock]; [managedObjectContext reset];//to drop pending changes if ([persistentStoreCoordinator removePersistentStore:persistentStore error:&error]) { NSURL* storeURL = [NSURL fileURLWithPath:[self pathForPersistentStore]]; [[NSFileManager defaultManager] removeFileAtPath:[storeURL path] handler:nil]; [self addPersistentStore];//recreates the persistent store } [managedObjectContext unlock]; 

Voici ce que j'ai fait pour nettoyer entièrement mes données de base. Cela fonctionne parfaitement. C'est si vous avez seulement un magasin persistant ce qui est probablement le cas si vous n'en avez pas ajouté un manuellement. Si votre managedObjectContext a le même nom qu'ici, vous pouvez simplement copyr / passer cela fonctionnera.

 NSError * error; // resortingeve the store URL NSURL * storeURL = [[managedObjectContext persistentStoreCoordinator] URLForPersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject]]; // lock the current context [managedObjectContext lock]; [managedObjectContext reset];//to drop pending changes //delete the store from the current managedObjectContext if ([[managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error]) { // remove the file containing the data [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]; //recreate the store like in the appDelegate method [[managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];//recreates the persistent store } [managedObjectContext unlock]; //that's it ! 

La version rapide de @Nicolas Manzini réponse:

 if let psc = self.managedObjectContext?.persistentStoreCoordinator{ if let store = psc.persistentStores.last as? NSPersistentStore{ let storeUrl = psc.URLForPersistentStore(store) self.managedObjectContext?.performBlockAndWait(){ self.managedObjectContext?.reset() var error:NSError? if psc.removePersistentStore(store, error: &error){ NSFileManager.defaultManager().removeItemAtURL(storeUrl, error: &error) psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeUrl, options: nil, error: &error) } } } } 

Basé sur @Nicolas Manzini réponse, j'ai écrit une version 2.1 Swift avec peu d'améliorations. J'ai ajouté une extension à NSManagedObjectContext . Code complet ci-dessous:

 import Foundation import CoreData extension NSManagedObjectContext { func deleteAllData() { guard let persistentStore = persistentStoreCoordinator?.persistentStores.last else { return } guard let url = persistentStoreCoordinator?.URLForPersistentStore(persistentStore) else { return } performBlockAndWait { () -> Void in self.reset() do { try self.persistentStoreCoordinator?.removePersistentStore(persistentStore) try NSFileManager.defaultManager().removeItemAtURL(url) try self.persistentStoreCoordinator?.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil) } catch { /*dealing with errors up to the usage*/ } } } } 

Vous pouvez parcourir tous les objects et les supprimer en procédant comme suit:

 [managedObjectContext deleteObject:someObject]; 

Si vous souhaitez supprimer tous les objects, il est probablement plus rapide de supprimer le magasin, puis de recréer la stack CoreData.

Trash votre file de données et le refaire.

Il y a une fonction

entrez la description de l'image ici

Selon la WWDC 242 , vous pouvez l'utiliser pour effacer une database.

Il y a aussi une func replacePersistentStore qui remplace la database courante par une base sélectionnée.

Le moyen le plus rapide de tout abandonner est d'envoyer le context de votre object géré au message de reset .