2009-11-12 14 views
14

¿Hay alguna forma de eliminar todos los registros de NSManagedObjectContext?Eliminar todos los registros en NSManagedObjectContext

estoy usando el siguiente código para insertar datos:

NSManagedObjectContext * context = [[NSApp delegate] managedObjectContext]; 
NSManagedObject  * basket = nil; 

basket = [NSEntityDescription insertNewObjectForEntityForName:@"ShoppingBasket" 
             inManagedObjectContext: context]; 
[basket setValue:[firstSelectedObject valueForKey:@"accessoryID"] 
      forKey: @"accessoryID"]; 

¿Cómo borrar todos los registros? Quiero algo que sea como la función "eliminar:", pero para eliminar todo.

Respuesta

39

Para eliminar todas las instancias de una entidad determinada (usaremos su ShoppingBasket), simplemente puede buscar todas las cestas y luego eliminarlas. Está a sólo unas pocas líneas de código:

NSManagedObjectContext * context = [self managedObjectContext]; 
NSFetchRequest * fetch = [[[NSFetchRequest alloc] init] autorelease]; 
[fetch setEntity:[NSEntityDescription entityForName:@"ShoppingBasket" inManagedObjectContext:context]]; 
NSArray * result = [context executeFetchRequest:fetch error:nil]; 
for (id basket in result) 
    [context deleteObject:basket]; 

La alternativa en una aplicación basada en la no-documento es apagar su conexión con el almacén de datos, borrar el archivo real, a continuación, vuelva a conectar (el código de plantilla que viene con un proyecto estándar de Core Data creará automáticamente el archivo si está ausente). Luego tienes una tienda nueva y vacía.

Nota: el ejemplo de código ignora cualquier posible error. No hagas eso. :-)

+1

¿No hay una solución de 1 línea de código? es decir, Contexto de vaciado, o contexto vacío, o borrarTodo – aneuryzm

+0

No. No es conveniente "DROP DATABASE"; estar en. –

+0

Sí, sí, ver mi respuesta a continuación. Elimina la base de datos y te permite volver a crearla. – runmad

5

Una forma mucho más rápida sería eliminar completamente la tienda. De esta forma no perderás ningún tiempo buscando objetos o enumerando a través de ellos como lo hace la otra respuesta.

NSError *error; 
NSURL *applicationDocumentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"MyCDStore.sqlite"]; 
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error]; 

No olvide volver a crearlo después de haberlo eliminado.

+0

¿Este método es seguro de usar? ¿Podemos suponer que los datos centrales siempre se guardarán con este nombre, esta ubicación siempre? – msk

+0

Sí, si está utilizando el mismo contexto de objeto gestionado para volver a crearlo. – runmad

+2

Esto supone iOS y no tiene en cuenta los problemas con los almacenes de datos basados ​​en documentos OS X. No se puede simplemente golpear el documento de un usuario como este. –

Cuestiones relacionadas