[Risposta tardiva in risposta a una generosità che richiede risposte più recenti]
Guardando le risposte precedenti,
- Il recupero e l'eliminazione di tutti gli elementi, come suggerito da @Grouchal e altri, è ancora una soluzione efficace e utile. Se si dispone di archivi di dati molto grandi, potrebbe essere lento, ma funziona ancora molto bene.
- La semplice rimozione dell'archivio dati, come notate tu e @groundhog, non è più efficace. È obsoleto anche se non si utilizza l'archiviazione binaria esterna perché iOS 7 utilizza la modalità WAL per il journaling di SQLite. Con la modalità WAL potrebbero esserci file journal (potenzialmente di grandi dimensioni) in giro per qualsiasi archivio persistente di Core Data.
Ma esiste un approccio diverso e simile per rimuovere l'archivio persistente che funziona. La chiave è mettere il tuo file di archivio persistente nella sua sottodirectory che non contiene nient'altro. Non limitarti a inserirlo nella directory dei documenti (o ovunque), crea una nuova sottodirectory solo per l'archivio permanente. Il contenuto di quella directory finirà per essere il file di archivio permanente, i file journal e i file binari esterni. Se si desidera eseguire il nuke dell'intero archivio dati, eliminare quella directory e scompariranno tutti.
Faresti qualcosa del genere quando imposti il tuo negozio 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...
}
Quindi, quando volevi rimuovere il negozio,
[[NSFileManager defaultManager] removeItemAtURL:storeDirectoryURL error:nil];
Ciò rimuove in modo ricorsivo sia la sottodirectory personalizzata che tutti i file Core Data in essa contenuti.
Funziona solo se non hai già il tuo archivio permanente nella stessa cartella di altri dati importanti . Come la directory dei documenti, che probabilmente contiene altre cose utili. Se questa è la vostra situazione, si potrebbe ottenere lo stesso effetto con la ricerca di file che non si desidera mantenere e la rimozione di tutto il resto. Qualcosa di simile a:
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.
}
Questo approccio può essere soggetto a errori . Devi essere assolutamente sicuro di conoscere tutti i file che vuoi conservare, perché altrimenti potresti rimuovere dati importanti. D'altra parte, è possibile rimuovere i file binari esterni senza conoscere effettivamente il nome del file / directory utilizzato per memorizzarli.
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880