Você conhece alguma maneira de excluir todas as entradas armazenadas no Core Data? Meu esquema deve permanecer o mesmo; Eu só quero redefini-lo em branco.
Editar
Estou procurando fazer isso programaticamente, para que um usuário possa essencialmente pressionar um reset
botão.
ios
cocoa
cocoa-touch
core-data
nsmanagedobject
Michael Grinich
fonte
fonte
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880Respostas:
Você ainda pode excluir o arquivo programaticamente, usando o método NSFileManager: removeItemAtPath ::.
Em seguida, adicione novamente o armazenamento persistente para garantir que ele seja recriado corretamente.
A maneira programática de iterar através de cada entidade é mais lenta e propensa a erros. O uso para fazer dessa maneira é se você deseja excluir algumas entidades e outras não. No entanto, você ainda precisa garantir a integridade referencial ou não poderá persistir nas alterações.
Apenas remover a loja e recriá-la é rápido e seguro, e certamente pode ser feito programaticamente em tempo de execução.
Atualização para iOS5 +
Com a introdução do armazenamento binário externo (permiteExternalBinaryDataStorage ou Store in External Record File) no iOS 5 e OS X 10.7, simplesmente excluir arquivos apontados por storeURLs não é suficiente. Você deixará os arquivos de registro externos para trás. Como o esquema de nomeação desses arquivos de registro externos não é público, ainda não tenho uma solução universal. - an0 8 / mai / 12 às 23:00
fonte
Você pode excluir o arquivo SQLite - mas eu escolho fazê-lo limpando as tabelas individualmente com as seguintes funções:
A razão pela qual escolhi fazê-lo tabela por tabela é que isso me faz confirmar, enquanto estou fazendo a programação, que a exclusão do conteúdo da tabela é sensata e não há dados que eu prefira manter.
Fazer isso será muito mais lento do que apenas excluir o arquivo e mudarei para uma exclusão de arquivo se esse método demorar muito.
fonte
Solução atualizada para iOS 10+
Use
NSBatchDeleteRequest
para excluir todos os objetos na entidade sem precisar carregá-los na memória ou iterá-los.Este código foi atualizado para iOS 10 e Swift 3. Se você precisar oferecer suporte ao iOS 9, consulte esta pergunta .
Fontes:
fonte
moc.performBlockAndWait({ () -> Void in
...})
.Escrevi um
clearStores
método que percorre todas as lojas e o excluo do coordenador e do sistema de arquivos (tratamento de erros deixado de lado):Esse método está dentro de uma
coreDataHelper
classe que cuida (entre outras coisas) da criação do persistentStore quando é nulo.fonte
Eu removo todos os dados dos dados principais de um evento de botão em uma classe HomeViewController: Este artigo me ajudou tanto que achei que contribuiria.
Observe que, para chamar self.persistentStoreCoordinator, declarei uma propriedade no Home View Controller. (Não se preocupe com o managedObjectContext que eu uso para salvar e carregar.)
Em seguida, no AppDelegate ApplicationDidFinishLaunching logo abaixo, crie um HomeViewController que tenho:
fonte
O MagicalRecord torna isso muito fácil.
fonte
MR_truncateAll
?iOS9 +, Swift 2
Excluir todos os objetos em todas as entidades
fonte
[Resposta tardia em resposta a uma recompensa pedindo respostas mais recentes]
Examinando respostas anteriores,
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:
Então, quando você quis remover a loja,
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:
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.
fonte
Aqui está a solução combinada para limpar os Dados Principais.
fonte
Se você deseja excluir todos os objetos e não deseja excluir os arquivos de backup, pode usar os seguintes métodos:
Cuidado, pois pode ser muito lento (depende de quantos objetos estão no seu gráfico de objetos).
fonte
Se você deseja ir para a rota excluir todos os objetos (que é muito mais simples do que derrubar a pilha de dados principais, mas com menos desempenho), é uma implementação melhor:
Essa implementação aproveita
NSOperation
a exclusão do encadeamento principal e a notificação na conclusão. Convém emitir uma notificação ou algo dentro do bloco de conclusão para retornar o status ao segmento principal.fonte
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
para usar esse método, ou então você recebe o erro:Can only use -performBlock: on an NSManagedObjectContext that was created with a queue.
Solução iOS 10 + Swift 3:
Repete todas as entidades de dados principais e as limpa
fonte
Obrigado pelo post. Eu o segui e funcionou para mim. Mas tive outro problema que não foi mencionado em nenhuma das respostas. Então, eu não tenho certeza se era apenas eu.
Enfim, pensei em postar aqui o problema e meu jeito de resolvê-lo.
Eu tinha alguns registros no banco de dados, queria limpar tudo antes de gravar novos dados no banco de dados, então fiz tudo, incluindo
e então usado
managedObjectContext
para acessar o banco de dados (que deveria estar vazio agora), de alguma forma os dados ainda estavam lá. Depois de um tempo de resolução de problemas, eu descobri que eu preciso redefinirmanagedObjectContext
,managedObject
,managedObjectModel
epersistentStoreCoordinator
, antes de eu usarmanagedObjectContext
para acessar o dabase. Agora eu tenho um banco de dados limpo para escrever.fonte
Aqui está uma versão um pouco simplificada, com menos chamadas para o AppDelegate e o último pedaço de código que foi deixado de fora da resposta mais votada. Também estava recebendo um erro "O armazenamento persistente do objeto não está acessível a partir deste coordenador do NSManagedObjectContext", portanto, era necessário apenas adicioná-lo novamente.
fonte
solução rápida:
fonte
let modelURL = NSBundle.mainBundle().URLForResource("some string", withExtension: "momd")!
Como uma referência rápida para salvar a pesquisa em outro lugar - recriar o armazenamento persistente após a exclusão pode ser feito com:
fonte
Várias boas respostas para esta pergunta. Aqui está um bom e conciso. As duas primeiras linhas excluem o banco de dados sqlite. Em seguida, o loop for: exclui todos os objetos na memória managedObjectContext.
fonte
você também pode encontrar todos os nomes de entidades e excluí-los por nome. É uma versão mais longa, mas funciona bem, assim você não precisa trabalhar com armazenamento de persistência
para "Any_Entity_Name" forneça apenas o nome da sua entidade, precisamos apenas descobrir a descrição da entidade em que elas estão. ValueForKey @ "name" retornará todos os nomes de entidade. Finalmente, não se esqueça de salvar.
fonte
A resposta aceita está correta, com a remoção do URL pelo NSFileManager, mas conforme declarado na edição iOS 5+, o armazenamento persistente não é representado apenas por um arquivo. Para a loja SQLite, é * .sqlite, * .sqlite-shm e * .sqlite-wal ... felizmente, desde o iOS 7+, podemos usar o método
[NSPersistentStoreCoordinator + removeUbiquitousContentAndPersistentStoreAtURL: opções: erro:]
para cuidar da remoção, então o código deve ser algo como isto:
fonte
Aqui está uma versão que exclui todos os registros em todas as tabelas que você possui.
Swift 4
fonte
Swift 4/5, iOS 9 ou superior
A reconstrução de todo o
CoreData
arquivo SQLite garantirá que todos os dados sejam apagados, portanto, todas as entidades serão excluídas. Basta ligardeleteAndRebuild()
.fonte
Funciona com todas as versões. Passe o nome da entidade e percorra para excluir todas as entradas e salvar o contexto.
fonte
Um outro método (além de uma solicitação de exclusão em lote) que geralmente uso (com base nos requisitos do aplicativo) é redefinir o armazenamento persistente. A implementação é assim para iOS 10+ e Swift (supondo que você tenha uma classe CoreDataManager):
Uma vantagem desse método é que é mais direto, especialmente quando você tem um monte de registros de dados para várias entidades em seus dados principais. Nesse caso, uma solicitação de exclusão em lote exigiria muita memória.
fonte
Solução Swift 5.1
fonte
Excluir o arquivo de armazenamento persistente e configurar um novo coordenador de armazenamento persistente?
fonte
Exclua o sqlite do seu fileURLPath e construa.
fonte
Supondo que você esteja usando
MagicalRecord
e tenha um armazenamento de persistência padrão:Não gosto de todas as soluções que supõem que certos arquivos existem e / ou exigem a inserção de nomes ou classes de entidades. Esta é uma maneira rápida e segura de excluir todos os dados de todas as entidades. Após a exclusão, ele também recriará uma pilha nova (na verdade, não tenho certeza de quão necessário é essa parte).
É ideal para situações no estilo "logout" quando você deseja excluir tudo, mas possui um repositório de trabalho e um moc para obter novos dados (uma vez que o usuário efetua login ...)
fonte
Usa isto
fonte
Peguei o código de Grouchal e, para acelerar, usei a enumeração no modo simultâneo (
NSEnumerationConcurrent
), ficou um pouco mais rápido em comparação ao loop for (no meu aplicativo, adicionei esse recurso aos testadores para que eles possam limpar dados e fazer testes, em vez de excluir e instalar aplicativo)fonte
aqui minha versão swift3 para excluir todos os registros. 'Usuários' é o nome da entidade
fonte