Estoy usando Core Data para persistir localmente los resultados de una llamada de servicios web. El servicio web devuelve el modelo de objeto completo para, digamos, "Autos", podría ser aproximadamente 2000 de ellos (y no puedo hacer que el Servicio Web devuelva nada menos que 1 o TODOS los autos.
La próxima vez que abra mi aplicación, quiero actualizar la copia persistente de Core Data llamando al Servicio Web para todos los Autos nuevamente, sin embargo, para evitar duplicados, primero necesitaría purgar todos los datos en la caché local.
¿Existe una forma más rápida de purgar TODAS las instancias de una entidad específica en el contexto del objeto administrado (por ejemplo, todas las entidades de tipo "CAR"), o necesito consultarlas para llamar, luego recorrer los resultados para eliminar cada una y luego guardar?
Idealmente, podría decir que elimine todo donde entidad es Blah.
fuente
Respuestas:
iOS 9 y posterior:
iOS 9 agregó una nueva clase llamada
NSBatchDeleteRequest
que le permite eliminar fácilmente objetos que coinciden con un predicado sin tener que cargarlos todos en la memoria. Así es como lo usarías:Swift 5
C objetivo
Se puede encontrar más información sobre las eliminaciones por lotes en la sesión "Novedades de los datos básicos" de WWDC 2015 (a partir de las ~ 14:10).
iOS 8 y versiones anteriores:
Obtenerlos todos y eliminarlos todos:
fuente
Restablecer entidad en Swift 3 :
fuente
Un poco más limpio y universal: agregue este método:
fuente
Para Swift 2.0:
fuente
Rápido:
fuente
Esta es una pregunta similar a la de aquí y alguien sugirió configurar una regla de eliminación de relación para que solo tenga que eliminar un objeto. Por lo tanto, si tiene o puede crear una entidad con una relación de muchos a los automóviles y establece la regla de eliminación en cascada cuando elimina la entidad superior, todos los automóviles también se eliminarán. Esto puede ahorrar algo de tiempo de procesamiento ya que no tiene que seguir los pasos necesarios para cargar TODOS los automóviles. En un conjunto de datos más grande, esto podría ser absolutamente necesario.
fuente
Ya se publicó una buena respuesta, ¡esto es solo una recomendación!
Una buena manera sería simplemente agregar una categoría
NSManagedObject
e implementar un método como lo hice:Archivo de encabezado (por ejemplo
NSManagedObject+Ext.h
)Archivo de código: (por ejemplo, NSManagedObject + Ext.m)
... lo único que tiene que hacer es obtener el ManageObjectContext del delegado de la aplicación, o de dónde lo tenga;)
luego puedes usarlo como:
Una optimización adicional podría ser que elimine el parámetro para el nombre de entidad y obtenga el nombre del nombre de clazz. esto llevaría al uso:
una impl más limpia (como categoría para NSManagedObjectContext):
El uso entonces:
fuente
[AppDelegate managedObjectContext]
no es necesariamente una "arquitectura limpia" .. ;-)deleteAllFromEntity: inManagedObjectContext:
Actualización de Swift 4, iOS 12 y Xcode 10
100% trabajando solo cortar y pegar
Simplemente coloque esta función en la clase relevante y llame a esta función
self.deleteData()
enviewDidLoad()
cualquier lugar o debajo de una función o un botón para que al hacer clic en un botón se eliminen todos los datos de la entidad y reemplace "myEntity" como su entidad que ha definido en su datos centralesfuente
Swift 3.X y Swift 4.X , manera fácil. Cambiar solo YourTable
fuente
iOS 10 y posterior
Funciona con todas las versiones. Pase el nombre de la entidad e itere para eliminar todas las entradas y guardar el contexto.
fuente
CoreDataStack()
oDataController()
clases son. Se agradecería una actualización;)Extendiendo la respuesta de Dave Delong.
Versión Swift que se encarga de iOS 9 y versiones anteriores también. También he cubierto el manejo de errores en esto:
let appDelegate: AppDelegate = UIApplication.sharedApplication (). delegar como! AppDelegate
fuente
¿Por qué no plegar los datos que recibe con el caché existente? De lo contrario, no es realmente "refrescante", es "comenzar de nuevo" y también podría soltar / eliminar el archivo SQLLite y comenzar de nuevo (suponiendo que no persista también otros datos).
fuente
Swift 4, iOS 10+
Función estática que se puede aplicar a cualquier entidad para eliminar todos sus datos
'Habitación' es una entidad
Editado en 20191025: la instrucción "Self.fetchRequest ()" puede causar problemas si usamos múltiples objetivos en los mismos proyectos. Entonces reemplazado con NSFetchRequest (entityName: String (describing: self))
fuente
si la entidad contiene muchas entradas, la mejor manera es así porque ahorra memoria
fuente
En Swift 3.0
fuente
Este código funcionará tanto para iOS 9 como para versiones inferiores.
fuente
iOS 9.0 y posterior:
NSBatchDeleteRequest
se utiliza para eliminar registros en datos centrales. Funciona muy rápido y toma menos tiempo eliminar todos los registros de una entidad. Se requiereNSFetchRequest
en la discusión. Si desea eliminar todos los registros de una entidad, puede usarlo y funciona para mí.fuente
purga rápida de todos los objetos en DB:
fuente
La respuesta de Dave Delongs Swift 2.0 me estaba fallando (en iOS 9)
Pero esto funcionó:
fuente
Solución Swift 3 con iOS 9 'NSBatchDeleteRequest' y respaldo a versiones anteriores de iOS implementadas como una extensión en 'NSManagedObjectContext'. Referencia de Apple https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html
fuente
Use NSBatchDeleteRequest para eliminar varios registros si el mínimo de iOS es 9.0. Si es un subproceso en segundo plano, ejecute NSManagedObjectContext save, de lo contrario, use NSFetchRequest para obtener registros y eliminar todos los registros en el bucle y Guardar una vez que se haya eliminado.
fuente
en iOS 11.3 y Swift 4.1
tienes que llamar a reset después de ejecutar. De lo contrario, no se actualizará en la vista de tabla.
fuente
fuente
la forma OOP sin cadenas como nombres de entidades Swift 3+, Xcode 10+
entonces solo llame al bloque do / catch
fuente
En Swift 2.0:
fuente