[Späte Antwort als Antwort auf ein Kopfgeld, das nach neueren Antworten fragt]
Blick auf frühere Antworten,
- Das Abrufen und Löschen aller Elemente, wie von @Grouchal und anderen vorgeschlagen, ist immer noch eine effektive und nützliche Lösung. Wenn Sie sehr große Datenspeicher haben, ist dies möglicherweise langsam, funktioniert aber dennoch sehr gut.
- Das einfache Entfernen des Datenspeichers ist, wie Sie und @groundhog bemerken, nicht mehr wirksam. Es ist veraltet, auch wenn Sie keinen externen Binärspeicher verwenden, da iOS 7 den WAL-Modus für SQLite-Journale verwendet. Im WAL-Modus befinden sich möglicherweise (möglicherweise große) Journaldateien für jeden persistenten Core Data-Speicher.
Es gibt jedoch einen anderen, ähnlichen Ansatz zum Entfernen des dauerhaften Speichers, der funktioniert. Der Schlüssel besteht darin, Ihre persistente Speicherdatei in einem eigenen Unterverzeichnis abzulegen, das nichts anderes enthält. Stecken Sie es nicht einfach in das Dokumentenverzeichnis (oder wo auch immer), sondern erstellen Sie ein neues Unterverzeichnis nur für den persistenten Speicher. Der Inhalt dieses Verzeichnisses ist letztendlich die persistente Speicherdatei, die Journaldateien und die externen Binärdateien. Wenn Sie den gesamten Datenspeicher zerstören möchten, löschen Sie dieses Verzeichnis, und alle verschwinden.
Sie würden so etwas tun, wenn Sie Ihren dauerhaften Speicher einrichten:
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...
}
Wenn Sie dann den Laden entfernen wollten,
[[NSFileManager defaultManager] removeItemAtURL:storeDirectoryURL error:nil];
Dadurch werden sowohl das benutzerdefinierte Unterverzeichnis als auch alle darin enthaltenen Core Data-Dateien rekursiv entfernt.
Dies funktioniert nur, wenn sich Ihr persistenter Speicher nicht bereits im selben Ordner wie andere wichtige Daten befindet . Wie das Dokumentenverzeichnis, das wahrscheinlich andere nützliche Dinge enthält. Wenn das Ihre Situation, könnte man den gleichen Effekt durch die Suche nach Dateien, die Sie tun behalten wollen und alles andere zu entfernen. Etwas wie:
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.
}
Dieser Ansatz kann fehleranfällig sein . Sie müssen absolut sicher sein, dass Sie jede Datei kennen, die Sie behalten möchten, da Sie sonst möglicherweise wichtige Daten entfernen. Auf der anderen Seite können Sie die externen Binärdateien entfernen, ohne den Datei- / Verzeichnisnamen zu kennen, in dem sie gespeichert wurden.
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880