[Respuesta tardía en respuesta a una recompensa pidiendo respuestas más nuevas]
Mirando las respuestas anteriores,
- Obtener y eliminar todos los elementos, según lo sugerido por @Grouchal y otros, sigue siendo una solución efectiva y útil. Si tiene grandes almacenes de datos, puede ser lento, pero aún funciona muy bien.
- Simplemente eliminar el almacén de datos ya no es efectivo, como notaron usted y @groundhog. Es obsoleto incluso si no usa almacenamiento binario externo porque iOS 7 usa el modo WAL para el diario de SQLite. Con el modo WAL puede haber archivos de diario (potencialmente grandes) para cualquier tienda persistente de Core Data.
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:
NSURL *storeDirectoryURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"persistent-store"];
if ([[NSFileManager defaultManager] createDirectoryAtURL:storeDirectoryURL
withIntermediateDirectories:NO
attributes:nil
error:nil]) {
NSURL *storeURL = [storeDirectoryURL URLByAppendingPathComponent:@"MyApp.sqlite"];
// continue with storeURL as usual...
}
Luego, cuando quisiste eliminar la tienda,
[[NSFileManager defaultManager] removeItemAtURL:storeDirectoryURL error:nil];
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:
NSString *docsDirectoryPath = [[self applicationDocumentsDirectory] path];
NSArray *docsDirectoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:docsDirectoryPath error:nil];
for (NSString *docsDirectoryItem in docsDirectoryContents) {
// Look at docsDirectoryItem. If it's something you want to keep, do nothing.
// If it's something you don't recognize, remove it.
}
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.
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880