[Resposta tardia em resposta a uma recompensa pedindo respostas mais recentes]
Examinando respostas anteriores,
- Buscar e excluir todos os itens, conforme sugerido por @Grouchal e outros, ainda é uma solução eficaz e útil. Se você tiver armazenamentos de dados muito grandes, pode ser lento, mas ainda funciona muito bem.
- Simplesmente remover o armazenamento de dados é, como você e o @groundhog observam, não é mais eficaz. É obsoleto mesmo se você não usar armazenamento binário externo, porque o iOS 7 usa o modo WAL para diário de SQLite. No modo WAL, pode haver arquivos de diário (potencialmente grandes) disponíveis para qualquer armazenamento persistente do Core Data.
Mas há uma abordagem diferente e semelhante para remover o armazenamento persistente que funciona. A chave é colocar seu arquivo de armazenamento persistente em seu próprio subdiretório que não contém mais nada. Não o cole no diretório de documentos (ou em qualquer outro lugar), crie um novo subdiretório apenas para o armazenamento persistente. O conteúdo desse diretório acabará sendo o arquivo de armazenamento persistente, os arquivos de diário e os arquivos binários externos. Se você quiser destruir o repositório de dados inteiro, exclua esse diretório e todos eles desaparecerão.
Você faria algo assim ao configurar sua loja 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...
}
Então, quando você quis remover a loja,
[[NSFileManager defaultManager] removeItemAtURL:storeDirectoryURL error:nil];
Isso remove recursivamente o subdiretório personalizado e todos os arquivos de dados principais nele.
Isso funciona apenas se você ainda não possui seu armazenamento persistente na mesma pasta que outros dados importantes . Como o diretório de documentos, que provavelmente possui outras coisas úteis. Se essa é a sua situação, você pode obter o mesmo efeito, procurando por arquivos que você não deseja manter e remover tudo o resto. Algo como:
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.
}
Essa abordagem pode estar sujeita a erros . Você precisa ter certeza absoluta de que conhece todos os arquivos que deseja manter, pois, caso contrário, poderá remover dados importantes. Por outro lado, você pode remover os arquivos binários externos sem saber o nome do arquivo / diretório usado para armazená-los.
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880