¿Cómo elimino todos los objetos de mi tienda persistente en Core Data?

Tengo Core Data trabajando en mi aplicación. Por lo tanto, busco un archivo XML, analizo los datos en objetos modelo e los inserto en los datos centrales. Se guardan en la tienda persistente y puedo acceder a ellos cuando reinicio la aplicación. Sin embargo, quiero poder actualizar los datos en la tienda persistente a voluntad, así que primero necesito eliminar los objetos existentes de la tienda. ¿Hay un método directo para esto?

Gracias


Encontré esta solución:

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

Esto es lo que hice para limpiar mis Core Data por completo. Funciona perfectamente Esto es si solo tiene una tienda persistente, que probablemente sea el caso si no agregó una más manualmente. Si su managedObjectContext tiene el mismo nombre que aquí, puede simplemente copiar / pasar, funcionará.

 NSError * error; // retrieve 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 ! 

versión rápida de @Nicolas Manzini respuesta:

 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) } } } } 

Basado en la respuesta de @Nicolas Manzini, escribí una versión Swift 2.1 con pequeñas mejoras. He agregado una extensión a NSManagedObjectContext . Código completo a continuación:

 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*/ } } } } 

Puede recorrer todos los objetos y eliminarlos haciendo esto:

 [managedObjectContext deleteObject:someObject]; 

Si desea eliminar todos los objetos, probablemente sea más rápido eliminar la tienda y luego volver a crear la stack CoreData.

Trash su archivo de datos y rehacerlo.

Hay una función

enter image description here

De acuerdo con WWDC 242 , puede usarlo para borrar una base de datos.

También hay un func replacePersistentStore que está reemplazando la base de datos actual por una seleccionada.

La forma más rápida de deshacerse de todo es enviar el contexto de su objeto gestionado al mensaje de reset .