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")
}
}