[Réponse tardive en réponse à une prime demandant de nouvelles réponses]
En regardant les réponses précédentes,
- La récupération et la suppression de tous les éléments, comme suggéré par @Grouchal et d'autres, est toujours une solution efficace et utile. Si vous avez de très grands magasins de données, cela peut être lent, mais cela fonctionne toujours très bien.
- La simple suppression du magasin de données n'est plus, comme vous et @groundhog le notez, efficace. Il est obsolète même si vous n'utilisez pas de stockage binaire externe car iOS 7 utilise le mode WAL pour la journalisation SQLite. Avec le mode WAL, il peut y avoir des fichiers de journal (potentiellement volumineux) pour tout magasin persistant Core Data.
Mais il existe une approche différente et similaire pour supprimer le magasin persistant qui fonctionne. La clé est de placer votre fichier de stockage persistant dans son propre sous-répertoire qui ne contient rien d'autre. Ne vous contentez pas de le coller dans le répertoire des documents (ou n'importe où), créez un nouveau sous-répertoire juste pour le magasin persistant. Le contenu de ce répertoire finira par être le fichier de stockage persistant, les fichiers journaux et les fichiers binaires externes. Si vous souhaitez supprimer l'ensemble du magasin de données, supprimez ce répertoire et ils disparaîtront tous.
Vous feriez quelque chose comme ceci lors de la configuration de votre magasin persistant:
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...
}
Ensuite, lorsque vous avez voulu supprimer le magasin,
[[NSFileManager defaultManager] removeItemAtURL:storeDirectoryURL error:nil];
Cela supprime récursivement le sous-répertoire personnalisé et tous les fichiers Core Data qu'il contient.
Cela ne fonctionne que si vous n'avez pas déjà votre magasin persistant dans le même dossier que d'autres données importantes . Comme le répertoire des documents, qui contient probablement d'autres éléments utiles. Si tel est votre situation, vous pouvez obtenir le même effet en recherchant les fichiers que vous ne voulez garder et enlever tout le reste. Quelque chose comme:
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.
}
Cette approche peut être sujette aux erreurs . Vous devez être absolument sûr de connaître tous les fichiers que vous souhaitez conserver, sinon vous risquez de supprimer des données importantes. D'un autre côté, vous pouvez supprimer les fichiers binaires externes sans connaître le nom du fichier / répertoire utilisé pour les stocker.
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880