Estou usando o Core Data para persistir localmente os resultados de uma chamada de Serviços da Web. O serviço da Web retorna o modelo de objeto completo para, digamos, "Carros" - pode ter cerca de 2000 deles (e não posso fazer com que o Serviço da Web retorne nada menos que 1 ou TODOS os carros.
Na próxima vez que abrir meu aplicativo, desejo atualizar a cópia persistente dos Dados Principais, ligando para o Serviço Web de todos os Carros novamente. No entanto, para evitar duplicatas, precisaria limpar todos os dados no cache local primeiro.
Existe uma maneira mais rápida de limpar TODAS as instâncias de uma entidade específica no contexto do objeto gerenciado (por exemplo, todas as entidades do tipo "CAR"), ou eu preciso consultá-las, em seguida, percorrer os resultados para excluir cada um e salvar?
Idealmente, eu poderia dizer excluir tudo onde entidade é Blah.
fonte
Respostas:
iOS 9 e posterior:
O iOS 9 adicionou uma nova classe chamada
NSBatchDeleteRequest
que permite excluir facilmente objetos correspondentes a um predicado sem precisar carregá-los todos na memória. Veja como você o usaria:Swift 5
Objetivo-C
Mais informações sobre exclusões em lote podem ser encontradas na sessão "O que há de novo nos dados principais" da WWDC 2015 (a partir das ~ 14: 10).
iOS 8 e versões anteriores:
Busque todos eles e exclua todos:
fonte
Redefinir entidade no Swift 3 :
fonte
Um pouco mais limpo e universal: adicione este método:
fonte
Para o Swift 2.0:
fonte
Rápido:
fonte
Essa é uma pergunta semelhante à pergunta aqui e alguém sugeriu a configuração de uma regra de exclusão de relacionamento, portanto, você só precisa excluir um objeto. Portanto, se você tiver ou puder criar uma entidade com um relacionamento de muitos com os carros e definir a regra de exclusão para cascata ao excluir a entidade superior, todos os carros também serão excluídos. Isso pode economizar tempo de processamento, pois você não precisa executar as etapas envolvidas no carregamento de TODOS os carros. Em um conjunto de dados maior, isso pode ser absolutamente necessário.
fonte
Uma boa resposta já foi postada, isso é apenas uma recomendação!
Uma boa maneira seria apenas adicionar uma categoria
NSManagedObject
e implementar um método como eu fiz:Arquivo de cabeçalho (por exemplo
NSManagedObject+Ext.h
)Arquivo de código: (por exemplo, NSManagedObject + Ext.m)
... a única coisa que você precisa fazer é obter o managedObjectContext do delegado do aplicativo ou de onde você estiver;)
depois você pode usá-lo como:
outra otimização poderia ser a remoção do parâmetro para o nome da entidade e o nome do nome do clazz. isso levaria ao uso:
um impl mais limpo (como categoria para NSManagedObjectContext):
O uso então:
fonte
[AppDelegate managedObjectContext]
não é necessariamente uma "arquitetura limpa" .. ;-)deleteAllFromEntity: inManagedObjectContext:
Atualização Swift 4, iOS 12 e Xcode 10
100% trabalhando apenas recortar e colar
Basta colocar essa função na classe relevante e chamar essa função
self.deleteData()
emviewDidLoad()
ou em qualquer lugar ou abaixo de uma função ou botão para que, ao clicar em um botão, todos os dados da entidade sejam excluídos e substitua "myEntity" como sua entidade que você definiu em sua entidade. dados principaisfonte
Swift 3.X e Swift 4.X , Maneira fácil. Alterar apenas YourTable
fonte
iOS 10 e posterior
Funciona com todas as versões. Passe o nome da entidade e percorra para excluir todas as entradas e salvar o contexto.
fonte
CoreDataStack()
ouDataController()
classes são. Uma atualização seria apreciada;)Estendendo a resposta de Dave Delong.
Versão Swift que cuida do iOS 9 e versões anteriores também. Também abordamos o tratamento de erros:
deixe appDelegate: AppDelegate = UIApplication.sharedApplication (). delegar como! AppDelegate
fonte
Por que não dobrar os dados que você recebe com o cache existente? Caso contrário, não é realmente 'refrescante', está 'começando de novo' e você também pode excluir / excluir o arquivo SQLLite e começar de novo (supondo que você não persista outros dados também).
fonte
Função estática Swift 4, iOS 10+ , que pode ser aplicada a qualquer entidade para remover todos os seus dados
'Room' é uma entidade
Editada em 20191025: a instrução "Self.fetchRequest ()" pode causar problemas se usarmos vários destinos nos mesmos projetos. Substituído por NSFetchRequest (entityName: String (descrevendo: self))
fonte
se a entidade contiver muitas entradas, a melhor maneira é a seguinte, pois economiza memória
fonte
No Swift 3.0
fonte
Este código funcionará para iOS 9 e abaixo
fonte
iOS 9.0 e posterior:
NSBatchDeleteRequest
é usado para excluir registros nos dados principais. Funciona muito rápido e leva menos tempo para excluir todos os registros de uma entidade. RequerNSFetchRequest
no argumento. Se você deseja excluir todos os registros de uma entidade, pode usá-lo e funciona para mim.fonte
limpeza rápida de todos os objetos no DB:
fonte
A resposta Swift 2.0 de Dave Delongs estava falhando para mim (no iOS 9)
Mas isso funcionou:
fonte
Solução Swift 3 com o iOS 9 'NSBatchDeleteRequest' e fallback para versões anteriores do iOS implementadas como uma extensão no 'NSManagedObjectContext'. Referência da Apple https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html
fonte
Use NSBatchDeleteRequest para excluir vários registros Se o iOS mínimo for 9.0. Se o encadeamento em segundo plano, executar o NSManagedObjectContext, salve mais, use NSFetchRequest para obter registros e excluir todos os registros no loop for e Salvar quando a exclusão for concluída.
fonte
no iOS 11.3 e Swift 4.1
você precisa chamar reset depois de executar. Caso contrário, ele não será atualizado na exibição da tabela.
fonte
fonte
da maneira OOP sem nenhuma string, como o nome das entidades Swift 3+, Xcode 10+
então basta ligar no bloco do / catch
fonte
No Swift 2.0:
fonte