¿Eliminar/restablecer todas las entradas en Core Data?
¿Conoce alguna forma de eliminar todas las entradas almacenadas en Core Data? Mi esquema debería seguir siendo el mismo; Sólo quiero restablecerlo a blanco.
Editar
Estoy buscando hacer esto mediante programación para que un usuario pueda esencialmente presionar un reset
botón.
Aún puede eliminar el archivo mediante programación, utilizando el método NSFileManager:removeItemAtPath::.
NSPersistentStore *store = ...;
NSError *error;
NSURL *storeURL = store.URL;
NSPersistentStoreCoordinator *storeCoordinator = ...;
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
Luego, simplemente vuelva a agregar el almacén persistente para asegurarse de que se vuelva a crear correctamente.
La forma programática de iterar a través de cada entidad es más lenta y propensa a errores. El uso de hacerlo de esa manera es si desea eliminar algunas entidades y no otras. Sin embargo, aún debe asegurarse de conservar la integridad referencial o no podrá conservar los cambios.
Simplemente eliminar la tienda y recrearla es rápido y seguro, y ciertamente se puede hacer mediante programación en tiempo de ejecución.
Actualización para iOS5+
Con la introducción del almacenamiento binario externo (permite el almacenamiento de datos binarios externos o el almacenamiento en un archivo de registro externo) en iOS 5 y OS X 10.7, simplemente eliminar los archivos señalados por storeURL no es suficiente. Dejarás atrás los archivos de registro externos. Dado que el esquema de nombres de estos archivos de registros externos no es público, todavía no tengo una solución universal. – an0 el 8 de mayo, 2012 a las 23:00
Puede eliminar el archivo SQLite, pero elijo hacerlo purgando las tablas individualmente con funciones:
- (void) deleteAllObjects: (NSString *) entityDescription {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:_managedObjectContext];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *items = [_managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
for (NSManagedObject *managedObject in items) {
[_managedObjectContext deleteObject:managedObject];
DLog(@"%@ object deleted",entityDescription);
}
if (![_managedObjectContext save:&error]) {
DLog(@"Error deleting %@ - error:%@",entityDescription,error);
}
}
La razón por la que elegí hacerlo tabla por tabla es que me hace confirmar mientras hago la programación que eliminar el contenido de la tabla es sensato y que no hay datos que prefiera conservar.
Hacerlo será mucho más lento que simplemente eliminar el archivo y cambiaré a eliminar el archivo si este método lleva demasiado tiempo.
Solución actualizada para iOS 10+
Úselo NSBatchDeleteRequest
para eliminar todos los objetos de la entidad sin tener que cargarlos en la memoria o recorrerlos en iteración.
// create the delete request for the specified entity
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = MyEntity.fetchRequest()
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
// get reference to the persistent container
let persistentContainer = (UIApplication.shared.delegate as! AppDelegate).persistentContainer
// perform the delete
do {
try persistentContainer.viewContext.execute(deleteRequest)
} catch {
print(error.localizedDescription)
}
Este código se actualizó para iOS 10 y Swift 3. Si necesita compatibilidad con iOS 9, consulte esta pregunta .
Fuentes:
- Datos básicos: la forma más rápida de eliminar todas las instancias de una entidad (incluye código Objective-C)
- Novedades de Core Data (vídeo de la WWDC 2015)
- Novedades de Core Data (vídeo de la WWDC 2016)
- Cómo utilizar datos básicos en iOS 10
- Novedades de Core Data Swift 3.0