Eliminación de datos básicos después de X cantidad de días

Así que tengo un montón de objects en Core Data y quiero que se borren automáticamente después de X cantidad de días (esto se basaría en un NSDate). Hice algunas búsquedas y parece que solo puedes eliminar un object de datos de núcleo a la vez, no un grupo de ellos, y mucho less los que están basados ​​en una date determinada. Estoy pensando que tal vez para tener un bucle corriendo a través de cada object, pero parece que sería un procesador muy pesado. ¿Alguna idea sobre dónde debería estar buscando hacer esto? Gracias.

Un bucle que borra los objects uno por uno es el enfoque correcto.

La eliminación de objects en Core Data es extremadamente pesada para el procesador. Si eso es un problema, Core Data no es adecuado para su proyecto, y debe usar otra cosa. Recomiendo FCModel , como una alternativa ligera que es muy eficiente.

Si va a seguir con Core Data, es una buena idea realizar grandes operaciones en un NSOperationQueue de background, por lo que la aplicación principal no está bloqueada mientras se eliminan los objects. Debe tener mucho cuidado con Core Data en varios subprocesss, el enfoque es tener un context de object administrado por separado para cada subprocess, ambos usando el mismo coordinador de la tienda persistente. No comparta nunca un object gestionado a través de subprocesss, pero puede compartir el ID del object, para get una segunda copy del mismo logging de la database en el otro context de object gestionado.

Básicamente, su subprocess de background crea un nuevo context, elimina todos los objects en un ciclo y luego (en el subprocess principal, preferiblemente, consulte la documentation) guarde el context de subprocesss de background. Esto fusionará tus cambios a less que haya un conflicto (ambos contexts modifican el mismo object), en ese escenario tienes algunas opciones, simplemente aborto la operación de eliminación completa y comienzo de nuevo.

Apple tiene buena documentation disponible para todos los problemas y el código de ejemplo disponible aquí: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdConcurrency.html

Es un poco desalentador, necesitas hacer una tarea seria, pero el código real es muy simple una vez que te das count de cómo funciona todo. O simplemente use FCModel, que está diseñado para operaciones por lotes rápidas.

No es tan pesado como puede pensar 🙂 (por supuesto, depende de la cantidad de datos)

Siéntete libre de usar loop

- (void)deleteAllObjects { NSArray *allEntities = self.managedObjectModel.entities; for (NSEntityDescription *entityDescription in allEntities) { NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:entityDescription]; fetchRequest.includesPropertyValues = NO; fetchRequest.includesSubentities = NO; NSError *error; NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; for (NSManagedObject *managedObject in items) { [self.managedObjectContext deleteObject:managedObject]; } if (![self.managedObjectContext save:&error]) { NSLog(@"Error occurnetworking"); } } } 

Como otros han observado, iterar sobre los objects es la única manera de eliminar realmente los objects en Core Data. Este es uno de esos casos de uso en los que el enfoque de Core Data cae, porque no está optimizado para ese tipo de uso.

Pero hay maneras de lidiar con esto para evitar retrasos no deseados en su aplicación, de modo que el usuario no tenga que esperar mientras su código contiene más de una tonelada de requestes de eliminación.

Si tiene muchos objects que deben eliminarse y no desea tener que esperar hasta que finalice el process, puede falsificar el borrado inicial al principio y luego eliminarlo cuando sea conveniente. Algo como:

  1. Agregue un atributo boolean personalizado al tipo de entidad llamado something like toBeDeleted con un valor pnetworkingeterminado de NO .
  2. Cuando tenga un montón de objects para eliminar, establezca toBeDeleted en YES en todos ellos en un solo paso mediante NSBatchUpdateRequest (nuevo en iOS 8). Esta class es en su mayoría indocumentada, así que mira el file del encabezado o en la publicación del blog de BNR al respecto . Especificará el nombre de la propiedad y el nuevo valor del atributo, y Core Data realizará una actualización masiva y rápida.
  3. Asegúrate de que tus requestes de búsqueda verifiquen que toBeDeleted sea NO . Ahora los objects marcados para su eliminación serán excluidos al getlos aunque todavía existan.
  4. En algún momento, más adelante, pero pronto, ejecute un código en segundo plano que recupere y elimine objects que tienen que toBeDeleted en YES .