2010-03-03 27 views
15

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?¿Cómo elimino todos los objetos de mi tienda persistente en Core Data?

Gracias


he encontrado 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]; 

Respuesta

60

Esto es lo que he hecho para limpiar completamente mi Core Data. Funciona perfectamente Esto es si solo tiene una tienda persistente, que probablemente sea el caso si no agrega 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 ! 
+0

¡Gracias, muy bien! Una pregunta: ¿Cómo usamos el 'error NSError **' con ARC? Da el error: 'Puntero a tipo no const' 'NSError ** "sin propiedad explícita'. – Timo

+0

sí, debe declararlo con algún preinforme como _SomethingIDontRemeber NSError ** error, o simplemente pasar nil si no quiere el error será más fácil ...;) –

+7

O simplemente cambie la primera línea a 'NSError * error' y a partir de entonces, referencia 'y error'. –

1

Usted podría recorrer todos los objetos y eliminarlos al hacer esto:

[managedObjectContext deleteObject:someObject]; 

Si desea eliminar todo objetos probablemente sea más rápido eliminar la tienda y luego recrear la pila CoreData.

-3

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

+0

¿Eso no solo vaciará el contexto sino que dejará mis objetos en la tienda persistente? – conorgriffin

+0

Guarde el contexto después. – Giao

+7

Eso está mal. Si tiene objetos en su tienda persistente, estos se volverán a encontrar con la próxima fetchRequest. Todo lo que restablece es invalidar todas las referencias a managedObjects que el contexto contiene actualmente. – FelixLam

1

Trash su archivo de datos y rehacerlo.

+0

¿Estos pasos tienen más detalles? – David

+0

Se bloquea cuando un contexto privado que existía antes de eliminar el archivo intenta guardar ... – zumzum

6

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

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

realmente necesitaba esto gracias – jhamPac

5

Basado en respuesta @Nicolas Manzini he escribió 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*/ } 
     } 
    } 
} 
+0

Perfecto, justo lo que necesitaba. ¡Gracias! – mattsven

+0

¡Esta es la respuesta que todos buscan, perfecto! – dip

1

Hay una function

enter image description here

Según WWDC 242, se puede utilizar para la limpieza de una base de datos.

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

Cuestiones relacionadas