usar tutorial porque persistencia efecto datos data apple core-data swift3 ios10 xcode8

core-data - porque - swift 4 core data tutorial



Eliminar todos los datos en una entidad de Datos centrales en Swift 3 (3)

¿Hay alguna manera de hacer una eliminación por lotes de todos los datos almacenados en todas las entidades en los datos centrales?

Leí en alguna parte que en iOS 9 o 10 esa manzana introdujo una forma de eliminar lotes, pero parece que no puedo encontrar ninguna buena información al respecto.

En última instancia, solo necesito una función que atraviese una entidad y elimine todos los datos que contiene. Parece que debería ser lo suficientemente simple, pero la documentación / tutoriales para ella han resultado extremadamente difíciles de encontrar.

¿Alguna idea?

Editar

Agregué el siguiente código en un IBAction adjunto a un botón:

@IBAction func clearAllData(_ sender: AnyObject) { let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "PLProjects") let request = NSBatchDeleteRequest(fetchRequest: fetch) //get the data from core data getPLData() //reload the table view tableView.reloadData() }

Esto no parece funcionar sin embargo. Si cierro el proyecto y lo vuelvo a abrir, la información aún está allí. Estoy asumiendo que esta es también la razón por la cual la vista de tabla no se actualiza, porque los datos no se están borrando.


Declare el método para obtener el contexto en su clase de CoreDataManager

class func getContext() -> NSManagedObjectContext { guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) } if #available(iOS 10.0, *) { return appDelegate.persistentContainer.viewContext } else { return appDelegate.managedObjectContext } }

Llame al método anterior desde su subclase NSManagedObject:

class func deleteAllRecords() { //getting context from your Core Data Manager Class let managedContext = CoreDataManager.getContext() let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Your entity name") let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch) do { try managedContext.execute(deleteRequest) try managedContext.save() } catch { print ("There is an error in deleting records") } }


Está pensando en NSBatchDeleteRequest , que se agregó en iOS 9. Cree uno como este:

let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Employee") let request = NSBatchDeleteRequest(fetchRequest: fetch)

También puede agregar un predicado si solo desea eliminar instancias que coincidan con el predicado. Para ejecutar la solicitud:

let result = try managedObjectContext.executeRequest(request)

Tenga en cuenta que las solicitudes por lotes no actualizan su estado de aplicación actual. Si tiene objetos administrados en la memoria que se verían afectados por la eliminación, debe dejar de usarlos inmediatamente.


Para completar la respuesta de Tom, esto es lo que agregué para tener una rutina completa:

func deleteAllRecords() { let delegate = UIApplication.shared.delegate as! AppDelegate let context = delegate.persistentContainer.viewContext let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "CurrentCourse") let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch) do { try context.execute(deleteRequest) try context.save() } catch { print ("There was an error") } }