¿Conoces alguna forma de eliminar todas las entradas almacenadas en Core Data? Mi esquema debería permanecer igual; Solo quiero restablecerlo en blanco.
Editar
Estoy buscando hacer esto programáticamente para que un usuario pueda presionar un reset
botón.
ios
cocoa
cocoa-touch
core-data
nsmanagedobject
Michael Grinich
fuente
fuente
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880Respuestas:
Todavía puede eliminar el archivo mediante programación, utilizando el método NSFileManager: removeItemAtPath ::.
Luego, simplemente agregue la tienda persistente para asegurarse de que se vuelva a crear correctamente.
La forma programática para iterar a través de cada entidad es más lenta y propensa a errores. El uso para 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á persistir en sus cambios.
Simplemente quitar la tienda y recrearla es rápido y seguro, y ciertamente se puede hacer programáticamente en tiempo de ejecución.
Actualización para iOS5 +
Con la introducción del almacenamiento binario externo (permite el almacenamiento externo de datos binarios o almacenar en un archivo de registro externo) en iOS 5 y OS X 10.7, simplemente eliminar archivos apuntados por storeURLs no es suficiente. Dejará los archivos de registro externos. Dado que el esquema de nombres de estos archivos de registro externos no es público, todavía no tengo una solución universal. - an0 8 de mayo de 12 a las 23:00
fuente
Puede eliminar el archivo SQLite, pero elijo hacerlo purgando las tablas individualmente con funciones:
La razón por la que elegí hacerlo tabla por tabla es porque me hace confirmar, mientras estoy haciendo la programación, que eliminar el contenido de la tabla es razonable y no hay datos que prefiera conservar.
Hacerlo es mucho más lento que simplemente eliminar el archivo y cambiaré a una eliminación de archivo si este método lleva demasiado tiempo.
fuente
Solución actualizada para iOS 10+
Se usa
NSBatchDeleteRequest
para eliminar todos los objetos de la entidad sin tener que cargarlos en la memoria o iterar a través de ellos.Este código se ha actualizado para iOS 10 y Swift 3. Si necesita admitir iOS 9, consulte esta pregunta .
Fuentes:
fuente
moc.performBlockAndWait({ () -> Void in
...})
.He escrito un
clearStores
método que pasa por cada tienda y lo borra tanto del coordinador como del sistema de archivos (dejando de lado el manejo de errores):Este método está dentro de una
coreDataHelper
clase que se encarga (entre otras cosas) de crear persistentStore cuando es nulo.fuente
Elimino todos los datos de los datos centrales en un evento de botón en una clase HomeViewController: este artículo me ayudó tanto que pensé que contribuiría.
Tenga en cuenta que para llamar a self.persistentStoreCoordinator he declarado una propiedad en el Home View Controller. (No se preocupe por el ManageObjectContext que uso para guardar y cargar).
Luego, en AppDelegate ApplicationDidFinishLaunching justo debajo de crear un HomeViewController tengo:
fuente
MagicalRecord hace esto muy fácil.
fuente
MR_truncateAll
?iOS9 +, Swift 2
Eliminar todos los objetos en todas las entidades
fuente
[Respuesta tardía en respuesta a una recompensa pidiendo respuestas más nuevas]
Mirando las respuestas anteriores,
Pero hay un enfoque diferente y similar para eliminar la tienda persistente que funciona. La clave es colocar su archivo de almacenamiento persistente en su propio subdirectorio que no contiene nada más. No lo pegue en el directorio de documentos (o donde sea), cree un nuevo subdirectorio solo para la tienda persistente. El contenido de ese directorio terminará siendo el archivo de almacenamiento persistente, los archivos de diario y los archivos binarios externos. Si desea destruir todo el almacén de datos, elimine ese directorio y todos desaparecerán.
Haría algo como esto al configurar su tienda persistente:
Luego, cuando quisiste eliminar la tienda,
Eso elimina de forma recursiva tanto el subdirectorio personalizado como todos los archivos de Core Data que contiene.
Esto solo funciona si aún no tiene su tienda persistente en la misma carpeta que otros datos importantes . Al igual que el directorio de documentos, que probablemente tiene otras cosas útiles. Si ese es su caso, usted podría conseguir el mismo efecto mediante la búsqueda de archivos que no desee conservar y eliminar todo lo demás. Algo como:
Este enfoque puede ser propenso a errores . Debe estar absolutamente seguro de conocer todos los archivos que desea conservar, ya que de lo contrario podría eliminar datos importantes. Por otro lado, puede eliminar los archivos binarios externos sin saber realmente el nombre del archivo / directorio utilizado para almacenarlos.
fuente
Aquí hay una solución combinada para purgar los datos principales.
fuente
Si desea eliminar todos los objetos y no desea eliminar los archivos de respaldo, puede utilizar los siguientes métodos:
Tenga en cuenta que puede ser muy lento (depende de cuántos objetos haya en su gráfico de objetos).
fuente
Si desea ir a la ruta de eliminar todos los objetos (que es mucho más simple que derribar la pila de Core Data, pero menos eficiente), entonces esta es una mejor implementación:
Esta implementación aprovecha
NSOperation
para realizar la eliminación del hilo principal y notificar al finalizar. Es posible que desee emitir una notificación o algo dentro del bloque de finalización para que el estado vuelva al hilo principal.fuente
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
para poder usar este método o de lo contrario obtendrá el error:Can only use -performBlock: on an NSManagedObjectContext that was created with a queue.
Solución iOS 10 + Swift 3:
Itera a través de todas las entidades de datos centrales y las borra
fuente
Gracias por la publicacion. Lo seguí y funcionó para mí. Pero tuve otro problema que no se mencionó en ninguna de las respuestas. Así que no estoy seguro si solo fui yo.
De todos modos, pensé que publicaría aquí el problema y mi forma de resolverlo.
Tenía algunos registros en la base de datos, quería limpiar todo antes de escribir nuevos datos en la base de datos, así que hice todo, incluido
y luego solía
managedObjectContext
acceder a la base de datos (se suponía que ya estaba vacía), de alguna manera los datos todavía estaban allí. Después de un tiempo de resolución de problemas, he encontrado que tengo que reiniciarmanagedObjectContext
,managedObject
,managedObjectModel
ypersistentStoreCoordinator
, antes de que yo utilizomanagedObjectContext
para acceder a la dabase. Ahora tengo una base de datos limpia para escribir.fuente
Aquí hay una versión algo simplificada con menos llamadas a AppDelegate self y el último fragmento de código que quedó fuera de la respuesta mejor calificada. También recibí un error "No se puede acceder al almacén persistente del objeto desde este coordinador de NSManagedObjectContext", por lo que solo necesito agregarlo nuevamente.
fuente
solución rápida:
fuente
let modelURL = NSBundle.mainBundle().URLForResource("some string", withExtension: "momd")!
Como referencia rápida para guardar la búsqueda en otro lugar, puede volver a crear la tienda persistente después de eliminarla con:
fuente
Varias buenas respuestas a esta pregunta. Aquí hay una buena y concisa. Las dos primeras líneas eliminan la base de datos sqlite. Luego, el bucle for: elimina todos los objetos en la memoria managedObjectContext.
fuente
También puede encontrar todos los nombres de entidad y eliminarlos por nombre. Es una versión más larga pero funciona bien, de esa manera no tienes que trabajar con la tienda de persistencia
para "Any_Entity_Name" solo proporcione el nombre de cualquiera de su entidad, solo necesitamos averiguar la descripción de la entidad dentro de la cual se encuentran sus entidades. ValueForKey @ "name" devolverá todos los nombres de entidad. Finalmente, no olvides guardar.
fuente
La respuesta aceptada es correcta con la eliminación de URL por NSFileManager es correcta, pero como se indica en iOS 5+ edit, la tienda persistente no está representada solo por un archivo. Para la tienda SQLite es * .sqlite, * .sqlite-shm y * .sqlite-wal ... afortunadamente desde iOS 7+ podemos usar el método
[NSPersistentStoreCoordinator + removeUbiquitousContentAndPersistentStoreAtURL: opciones: error:]
para cuidar la eliminación, por lo que el código debería ser algo como esto:
fuente
Aquí hay una versión que elimina todos los registros en cada tabla que tiene.
Swift 4
fuente
Swift 4/5, iOS 9+
Reconstruir todo el
CoreData
archivo SQLite asegurará que se borren todos los datos, por lo tanto, se eliminarán todas las entidades. Solo llamadeleteAndRebuild()
.fuente
Funciona con todas las versiones. Pase el nombre de la entidad e itere para eliminar todas las entradas y guardar el contexto.
fuente
Otro método (aparte de una solicitud de eliminación de lotes) que uso a menudo (según los requisitos de la aplicación) es restablecer el almacén persistente. La implementación se ve así para iOS 10+ y Swift (suponiendo que tenga una clase CoreDataManager):
Una ventaja de este método es que es más sencillo, especialmente cuando tiene un montón de registros de datos para numerosas entidades en sus datos principales. En cuyo caso, una solicitud de eliminación por lotes requeriría mucha memoria.
fuente
Solución Swift 5.1
fuente
¿Eliminar el archivo de tienda persistente y configurar un nuevo coordinador de tienda persistente?
fuente
Elimine sqlite de su fileURLPath y luego compile.
fuente
Suponiendo que está utilizando
MagicalRecord
y tiene un almacén de persistencia predeterminado:No me gustan todas las soluciones que suponen que existen ciertos archivos y / o exigen ingresar los nombres o clases de las entidades. Esta es una manera segura (2) de Swift para eliminar todos los datos de todas las entidades. Después de eliminarlo, también recreará una pila nueva (en realidad no estoy seguro de cuán necesaria es esta parte).
Es un godo para situaciones de estilo de "cierre de sesión" cuando desea eliminar todo pero tiene un almacén y un moc en funcionamiento para obtener nuevos datos (una vez que el usuario inicia sesión ...)
fuente
Utilizar este
fuente
Tomé el código de Grouchal y, para acelerarlo, utilicé la enumeración con el modo concurrente (
NSEnumerationConcurrent
), se hizo un poco más rápido en comparación con for loop (en mi aplicación agregué esta función para los Probadores para que puedan borrar datos y hacer casos de prueba en lugar de eliminar y instalar aplicación)fuente
Aquí mi versión swift3 para eliminar todos los registros. 'Usuarios' es el nombre de la entidad
fuente