[Późna odpowiedź w odpowiedzi na nagrodę z prośbą o nowe odpowiedzi]
Przeglądając wcześniejsze odpowiedzi,
- Pobieranie i usuwanie wszystkich elementów, zgodnie z sugestią @Grouchal i innych, jest nadal skutecznym i użytecznym rozwiązaniem. Jeśli masz bardzo duże magazyny danych, może to być powolne, ale nadal działa bardzo dobrze.
- Po prostu usunięcie magazynu danych nie jest już skuteczne, jak zauważyłeś Ty i @groundhog. Jest przestarzały, nawet jeśli nie używasz zewnętrznej pamięci binarnej, ponieważ iOS 7 korzysta z trybu WAL do dziennika SQLite. W trybie WAL mogą znajdować się (potencjalnie duże) pliki dziennika dla każdego trwałego sklepu Core Data.
Ale istnieje inne, podobne podejście do usuwania trwałego sklepu, który działa. Kluczem jest umieszczenie pliku trwałego sklepu we własnym podkatalogu, który nie zawiera niczego innego. Nie umieszczaj go tylko w katalogu dokumentów (lub gdziekolwiek), utwórz nowy podkatalog tylko dla trwałego sklepu. Zawartość tego katalogu zakończy się trwałym plikiem magazynu, plikami dziennika i zewnętrznymi plikami binarnymi. Jeśli chcesz zniszczyć cały magazyn danych, usuń ten katalog, a wszystkie znikną.
Zrobisz coś takiego podczas konfigurowania trwałego sklepu:
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...
}
Gdy chcesz usunąć sklep,
[[NSFileManager defaultManager] removeItemAtURL:storeDirectoryURL error:nil];
To rekurencyjnie usuwa zarówno niestandardowy podkatalog, jak i wszystkie zawarte w nim pliki danych podstawowych.
Działa to tylko wtedy, gdy nie masz jeszcze trwałego sklepu w tym samym folderze, co inne ważne dane . Podobnie jak katalog dokumentów, który prawdopodobnie zawiera inne przydatne rzeczy. W takiej sytuacji możesz uzyskać ten sam efekt, szukając plików, które chcesz zachować, i usuwając wszystko inne. Coś jak:
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.
}
Takie podejście może być podatne na błędy . Musisz być absolutnie pewien, że znasz każdy plik, który chcesz zachować, ponieważ w przeciwnym razie możesz usunąć ważne dane. Z drugiej strony możesz usunąć zewnętrzne pliki binarne, nie znając nazwy pliku / katalogu użytego do ich przechowywania.
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880