[Пізня відповідь у відповідь на щедрості з проханням отримати новіші відповіді]
Переглядаючи попередні відповіді,
- Вилучення та видалення всіх елементів, як це запропонувало @Grouchal та інші, все ще є ефективним і корисним рішенням. Якщо у вас дуже великі сховища даних, то це може бути повільним, але воно все ще працює дуже добре.
- Просто вилучення сховища даних, як зазначаєте ви @ @groundhog, вже не ефективно. Це застаріло, навіть якщо ви не використовуєте зовнішнє бінарне сховище, оскільки iOS 7 використовує режим WAL для перегляду SQLite. У режимі WAL можливі (потенційно великі) файли журналів, які сидять навколо будь-якого постійного магазину Core Data.
Але існує інший, подібний підхід до вилучення постійного магазину, який працює. Ключ полягає в тому, щоб помістити свій постійний файл зберігання у власний підкаталог, який не містить нічого іншого. Не просто вставляти його в каталог документів (або де завгодно), створюйте новий підкаталог тільки для постійного магазину. Вміст цього каталогу в кінцевому підсумку буде постійним файлом зберігання, файлами журналів та зовнішніми бінарними файлами. Якщо ви хочете запустити все сховище даних, видаліть цей каталог, і всі вони зникнуть.
Ви зробите щось подібне, налаштовуючи свій постійний магазин:
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...
}
Тоді, коли ви хотіли прибрати магазин,
[[NSFileManager defaultManager] removeItemAtURL:storeDirectoryURL error:nil];
Це рекурсивно видаляє як користувацький підкаталог, так і всі файли основних даних у ньому.
Це працює лише в тому випадку, якщо у вас ще немає постійного зберігання в тій же папці, що й інші важливі дані . Як і каталог документів, в якому, ймовірно, є інші корисні речі. Якщо це ваша ситуація, ви можете отримати той же ефект, дивлячись на файли , які ви дійсно хочете зберегти і видалити все інше. Щось на зразок:
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.
}
Цей підхід може бути схильним до помилок . Ви повинні бути абсолютно впевнені, що знаєте кожен файл, який хочете зберегти, оскільки в іншому випадку ви можете видалити важливі дані. З іншого боку, ви можете видалити зовнішні бінарні файли, фактично не знаючи імені файлу / каталогу, який використовується для їх зберігання.
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880