2010-07-16 17 views
6

¿cómo puedo eliminar todos los objetos? Sé que puedo eliminar uno porcómo eliminar todos los objetos de Core Data

[managedObjectContext deleteObject:objToDelete]; 

¿es posible eliminar todo sin iterar todas las matrices? gracias

+1

posible duplicado de (http [Borrar/Restablecer todas las entradas en la base de datos?]: // stackoverflow. com/questions/1077810/delete-reset-all-entries-in-core-data) –

Respuesta

8

Marcar objetos para eliminar y luego guardar funciona de la manera en que lo hace porque Core Data aún necesita ejecutar las reglas de validación para todos los objetos que se eliminan. Después de todo, un objeto puede rechazar la eliminación en función de cómo responde al -validateForDelete:.

Si:

  • que realmente quiere eliminar todo en un almacén persistente
  • y que no lo hace cuidado de que los objetos de ese almacén persistente dicen que son válidos para su eliminación

Entonces:

  • Desmonte la pila de Datos centrales que está utilizando esa tienda persistente
  • y elimine el archivo de la tienda persistente.
2

Simplemente itere el conjunto y elimínelos. No hay un método definido para eliminarlos a todos.

+0

Ok, gracias, espero que nos proporcionen una mejor manera de hacerlo en el futuro :) – Burjua

6

También puede simplemente derribar la pila (liberando el NSManagedObjectContext, NSPersistentStore y NSManagedObjectModel) y eliminar el archivo. Probablemente sería más rápido que iterar sobre toda su base de datos y eliminar cada objeto individualmente.

Además, es poco probable que proporcionen esta funcionalidad en el futuro porque es fácil eliminar el archivo. Sin embargo, si crees que es importante, archiva un radar y avísale a Apple. De lo contrario, no sabrán cuántas personas quieren esta función.

8

esto es lo que hago "reiniciar" mi almacén de datos:

- (BOOL)resetDatastore 
{ 
    [[self managedObjectContext] lock]; 
    [[self managedObjectContext] reset]; 
    NSPersistentStore *store = [[[self persistentStoreCoordinator] persistentStores] lastObject]; 
    BOOL resetOk = NO; 

    if (store) 
    { 
     NSURL *storeUrl = store.URL; 
     NSError *error; 

     if ([[self persistentStoreCoordinator] removePersistentStore:store error:&error]) 
     { 
      [[self persistentStoreCoordinator] release]; 
      __persistentStoreCoordinator = nil; 
      [[self managedObjectContext] release]; 
      __managedObjectContext = nil; 

      if (![[NSFileManager defaultManager] removeItemAtPath:storeUrl.path error:&error]) 
      { 
       NSLog(@"\nresetDatastore. Error removing file of persistent store: %@", 
        [error localizedDescription]); 
       resetOk = NO; 
      } 
      else 
      { 
       //now recreate persistent store 
       [self persistentStoreCoordinator]; 
       [[self managedObjectContext] unlock]; 
       resetOk = YES; 
      } 
     } 
     else 
     { 
      NSLog(@"\nresetDatastore. Error removing persistent store: %@", 
       [error localizedDescription]); 
      resetOk = NO; 
     } 
     return resetOk; 
    } 
    else 
    { 
     NSLog(@"\nresetDatastore. Could not find the persistent store"); 
     return resetOk; 
    } 
} 
+0

Su código está funcionando de maravilla gracias Mucho ...... –

+0

+1 para casi ninguna notación de punto. Buen trabajo. Además, elimine las llamadas de liberación si necesita una implementación de ARC. – ColdLogic

+0

Gracias. Publiqué una versión modificada que usa '' '-performBlockAndWait:' '' –

11

Esta función elimina el archivo de SQLite db actual desde el disco y crea una nueva. Es mucho más rápido que cualquier eliminación iterativa.

-(void)deleteAndRecreateStore{ 
     NSPersistentStore * store = [[self.persistentStoreCoordinator persistentStores] lastObject]; 
     NSError * error;  
     [self.persistentStoreCoordinator removePersistentStore:store error:&error]; 
     [[NSFileManager defaultManager] removeItemAtURL:[store URL] error:&error]; 
     __managedObjectContext = nil; 
     __persistentStoreCoordinator = nil; 
     [self managedObjectContext];//Rebuild The CoreData Stack 
} 

Si desea llamar a esta aplicación fuera Delegado (suponiendo repetitivo integración CoreData) se puede utilizar this para obtener una referencia a su aplicación delegado:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate]; 

No se olvide de importar la cabecera .

+0

Buen código de código el último – ramirogm

+0

Rápido y simple - Me encanta, gracias por compartir ;-) –

1

Cuando elimina todos los documentos y la caché, está eliminando la base de datos.No es llamada NECESARIO a managedObjectContext

NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSArray *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
NSMutableArray *paths = [NSMutableArray array]; 
[paths addObjectsFromArray:documents]; 
[paths addObjectsFromArray:caches]; 
for (NSUInteger i = 0; i < [paths count]; i++) { 
    NSString *folderPath = [paths objectAtIndex:i]; 
    NSLog(@"Attempting to remove contents for: %@", folderPath); 
    //Remove all cached data in the local app directory 
    NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderPath error:&error]; 
    for (NSString *strName in dirContents) { 
     [[NSFileManager defaultManager] removeItemAtPath:[folderPath stringByAppendingPathComponent:strName] error:&error]; 
     if (error != nil) { 
      NSLog(@"Error removing item: %@ : %@", strName, error.description); 
     } else { 
      NSLog(@"Removed item: %@", strName); 
     } 
    } 
} 
0

he utilizado el código de stifin y actualizada a utilizar -performBlockAndWait:

- (BOOL)reset 
{ 
    __block BOOL result = YES; 

    [[self mainContext] performBlockAndWait:^{ 
     [[self mainContext] reset]; 

     NSArray* stores = [[self persistentStoreCoordinator] persistentStores]; 

     _mainContext = nil; 
     _persistedContext = nil; 

     for(NSPersistentStore* store in stores) { 
      NSError* error; 

      if(![[self persistentStoreCoordinator] removePersistentStore:store error:&error]) { 
       debuglog(@"Error removing persistent store: %@", [error localizedDescription]); 
       result = NO; 
      } 
      else { 
       if(![[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:&error]) { 
        debuglog(@"Error removing file of persistent store: %@", [error localizedDescription]); 
        result = NO; 
       } 
      } 
     } 

     _persistentStoreCoordinator = nil; 
    }]; 

    return result; 
}