J'utilise Core Data pour conserver localement les résultats d'un appel de services Web. Le service Web renvoie le modèle d'objet complet pour, disons, "Cars" - pourrait être environ 2000 d'entre eux (et je ne peux pas faire en sorte que le service Web renvoie moins de 1 ou TOUTES les voitures.
La prochaine fois que j'ouvrirai mon application, je souhaite actualiser la copie persistante des données de base en appelant à nouveau le service Web pour toutes les voitures, mais pour éviter les doublons, je devrais d'abord purger toutes les données du cache local.
Existe-t-il un moyen plus rapide de purger TOUTES les instances d'une entité spécifique dans le contexte de l'objet géré (par exemple, toutes les entités de type "CAR"), ou dois-je les interroger par appel, puis parcourir les résultats pour supprimer chacune, puis enregistrer?
Idéalement, je pourrais simplement dire supprimer tout où l'entité est Blah.
la source
Réponses:
iOS 9 et versions ultérieures:
iOS 9 a ajouté une nouvelle classe appelée
NSBatchDeleteRequest
qui vous permet de supprimer facilement des objets correspondant à un prédicat sans avoir à les charger tous en mémoire. Voici comment vous l'utiliseriez:Swift 5
Objectif c
Plus d'informations sur les suppressions de lots peuvent être trouvées dans la session "Quoi de neuf dans les données de base" de WWDC 2015 (à partir de ~ 14: 10).
iOS 8 et versions antérieures:
Récupérez-les tous et supprimez-les tous:
la source
Réinitialiser l'entité dans Swift 3 :
la source
Un peu plus propre et universel: Ajoutez cette méthode:
la source
Pour Swift 2.0:
la source
Rapide:
la source
Il s'agit d'une question similaire à celle ici et quelqu'un a suggéré de configurer une règle de suppression de relation afin que vous n'ayez à supprimer qu'un seul objet. Donc, si vous avez ou pouvez créer une entité avec une relation to-many avec les voitures et définir la règle de suppression en cascade lorsque vous supprimez l'entité supérieure, toutes les voitures seront également supprimées. Cela peut économiser du temps de traitement car vous n'avez pas à effectuer les étapes de chargement de TOUTES les voitures. Dans un ensemble de données plus important, cela pourrait être absolument nécessaire.
la source
Une bonne réponse a déjà été postée, ce n'est qu'une recommandation!
Un bon moyen serait simplement d'ajouter une catégorie
NSManagedObject
et d'implémenter une méthode comme je l'ai fait:Fichier d'en-tête (par exemple
NSManagedObject+Ext.h
)Fichier de code: (par exemple NSManagedObject + Ext.m)
... la seule chose que vous devez faire est d'obtenir le managedObjectContext du délégué de l'application, ou où tout ce que vous avez;)
ensuite vous pouvez l'utiliser comme:
une autre optimisation pourrait être que vous supprimiez le paramètre pour le nom d'entité et que vous obteniez le nom à la place du nom de clazz. cela conduirait à l'utilisation:
un impl plus propre (comme catégorie à NSManagedObjectContext):
L'utilisation alors:
la source
[AppDelegate managedObjectContext]
n'est pas nécessairement une "architecture propre" .. ;-)deleteAllFromEntity: inManagedObjectContext:
Mise à jour Swift 4, iOS 12 et Xcode 10
100% de travail, il suffit de couper et coller
Mettez simplement cette fonction dans la classe appropriée et appelez cette fonction
self.deleteData()
dansviewDidLoad()
ou n'importe où ou sous une fonction ou un bouton afin qu'en cliquant sur un bouton toutes les données de l'entité soient supprimées et remplacez "myEntity" comme votre entité que vous avez définie dans votre données de basela source
Swift 3.X et Swift 4.X , moyen facile. Modifier uniquement YourTable
la source
iOS 10 et versions ultérieures
Fonctionne avec toutes les versions. Passez le nom de l'entité et parcourez pour supprimer toutes les entrées et enregistrer le contexte.
la source
CoreDataStack()
ouDataController()
classes sont. Une mise à jour serait appréciée;)Prolonger la réponse de Dave Delong.
Version Swift qui prend également en charge iOS 9 et les versions précédentes. J'ai également couvert la gestion des erreurs dans ceci:
laissez appDelegate: AppDelegate = UIApplication.sharedApplication (). delegate as! AppDelegate
la source
Pourquoi ne pas intégrer les données que vous recevez avec le cache existant? Sinon, ce n'est pas vraiment «rafraîchissant», c'est «recommencer» et vous pouvez aussi bien supprimer / supprimer le fichier SQLLite et recommencer (en supposant que vous ne persistez pas d'autres données également).
la source
Swift 4,
fonction statique iOS 10+ qui peut demander à toute entité de supprimer toutes ses données
«Chambre» est une entité
Modifiée le 20191025: l'instruction "Self.fetchRequest ()" peut provoquer un problème si nous utilisons plusieurs cibles dans les mêmes projets. Donc remplacé par NSFetchRequest (entityName: String (décrivant: self))
la source
si l'entité contient beaucoup d'entrées, la meilleure façon est la suivante car elle économise de la mémoire
la source
Dans Swift 3.0
la source
Ce code fonctionnera pour iOS 9 et versions antérieures
la source
iOS 9.0 et versions ultérieures:
NSBatchDeleteRequest
est utilisé pour supprimer des enregistrements dans les données de base. Il fonctionne très rapidement et prend moins de temps pour supprimer tous les enregistrements d'une entité. Il fautNSFetchRequest
en argument. Si vous souhaitez supprimer tous les enregistrements d'une entité, vous pouvez l'utiliser et cela fonctionne pour moi.la source
purge rapide de tous les objets dans DB:
la source
La réponse Swift 2.0 de Dave Delongs plantait pour moi (dans iOS 9)
Mais cela a fonctionné:
la source
Solution Swift 3 avec iOS 9 «NSBatchDeleteRequest» et retour aux versions antérieures d'iOS implémentées en tant qu'extension sur «NSManagedObjectContext». Référence Apple https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html
la source
Utilisez NSBatchDeleteRequest pour supprimer plusieurs enregistrements si iOS minimal est 9,0. S'il s'agit d'un thread d'arrière-plan, exécutez NSManagedObjectContext, sinon utilisez NSFetchRequest pour obtenir les enregistrements et supprimez tous les enregistrements de la boucle et Enregistrer une fois la suppression effectuée.
la source
dans iOS 11.3 et Swift 4.1
vous devez appeler reset après avoir exécuté. Sinon, il ne sera pas mis à jour sur la vue de table.
la source
la source
la façon OOP sans aucune chaîne comme noms d'entités Swift 3+, Xcode 10+
puis appelez simplement dans le bloc do / catch
la source
Dans Swift 2.0:
la source