Connaissez-vous un moyen de supprimer toutes les entrées stockées dans Core Data? Mon schéma doit rester le même; Je veux juste le remettre à zéro.
Éditer
Je cherche à le faire par programme afin qu'un utilisateur puisse essentiellement reset
appuyer sur un bouton.
ios
cocoa
cocoa-touch
core-data
nsmanagedobject
Michael Grinich
la source
la source
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880Réponses:
Vous pouvez toujours supprimer le fichier par programme, à l'aide de la méthode NSFileManager: removeItemAtPath ::.
Ensuite, ajoutez simplement le magasin persistant pour vous assurer qu'il est recréé correctement.
La manière programmatique d'itérer à travers chaque entité est à la fois plus lente et sujette aux erreurs. L'utilisation de cette façon est si vous souhaitez supprimer certaines entités et pas d'autres. Cependant, vous devez toujours vous assurer de conserver l'intégrité référentielle ou vous ne pourrez pas conserver vos modifications.
Le simple fait de supprimer le magasin et de le recréer est à la fois rapide et sûr, et peut certainement être effectué par programme lors de l'exécution.
Mise à jour pour iOS5 +
Avec l'introduction du stockage binaire externe (permetExternalBinaryDataStorage ou Store in External Record File) dans iOS 5 et OS X 10.7, il ne suffit pas de supprimer les fichiers pointés par storeURLs. Vous laisserez les fichiers d'enregistrement externes derrière. Étant donné que le schéma de dénomination de ces fichiers d'enregistrement externes n'est pas public, je n'ai pas encore de solution universelle. - an0 8 mai 12 à 23h00
la source
Vous pouvez supprimer le fichier SQLite - mais je choisis de le faire en purgeant les tables individuellement avec une fonction:
La raison pour laquelle j'ai choisi de le faire table par table, c'est que cela me fait confirmer pendant la programmation que la suppression du contenu de la table est raisonnable et qu'il n'y a pas de données que je préfère conserver.
Le faire est beaucoup plus lent que la simple suppression du fichier et je passerai à une suppression de fichier si cette méthode prend trop de temps.
la source
Solution mise à jour pour iOS 10+
Permet
NSBatchDeleteRequest
de supprimer tous les objets de l'entité sans avoir à les charger en mémoire ou à les parcourir.Ce code a été mis à jour pour iOS 10 et Swift 3. Si vous devez prendre en charge iOS 9, consultez cette question .
Sources:
la source
moc.performBlockAndWait({ () -> Void in
...})
.J'ai écrit une
clearStores
méthode qui passe par chaque magasin et la supprime à la fois du coordinateur et du système de fichiers (gestion des erreurs laissée de côté):Cette méthode est à l'intérieur d'une
coreDataHelper
classe qui s'occupe (entre autres) de créer le persistentStore quand il est nul.la source
Je supprime toutes les données des données de base sur un événement de bouton dans une classe HomeViewController: Cet article m'a tellement aidé que je pensais contribuer.
Notez que pour appeler self.persistentStoreCoordinator, j'ai déclaré une propriété dans le Home View Controller. (Ne vous inquiétez pas du managedObjectContext que j'utilise pour l'enregistrement et le chargement.)
Ensuite, dans l'AppDelegate ApplicationDidFinishLaunching juste en dessous de la création d'un HomeViewController, j'ai:
la source
MagicalRecord rend cela très facile.
la source
MR_truncateAll
?iOS9 +, Swift 2
Supprimer tous les objets dans toutes les entités
la source
[Réponse tardive en réponse à une prime demandant de nouvelles réponses]
En regardant les réponses précédentes,
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:
Ensuite, lorsque vous avez voulu supprimer le magasin,
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:
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.
la source
Voici une solution combinée pour purger les données de base.
la source
Si vous souhaitez supprimer tous les objets et ne souhaitez pas supprimer les fichiers de sauvegarde, vous pouvez utiliser les méthodes suivantes:
Attention, cela peut être très lent (cela dépend du nombre d'objets dans votre graphe d'objets).
la source
Si vous souhaitez suivre la route Supprimer tous les objets (ce qui est beaucoup plus simple que de détruire la pile de Core Data, mais moins performant), c'est une meilleure implémentation:
Cette implémentation s'appuie
NSOperation
pour effectuer la suppression du thread principal et notifier à la fin. Vous voudrez peut-être émettre une notification ou quelque chose dans le bloc d'achèvement pour faire remonter le statut au fil principal.la source
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
pour utiliser cette méthode, sinon vous obtenez l'erreur:Can only use -performBlock: on an NSManagedObjectContext that was created with a queue.
Solution iOS 10 + Swift 3:
Itère toutes les entités de données principales et les efface
la source
Merci pour le post. Je l'ai suivi et cela a fonctionné pour moi. Mais j'avais un autre problème qui n'était mentionné dans aucune des réponses. Je ne sais donc pas si c'était juste moi.
Quoi qu'il en soit, j'ai pensé publier ici le problème et ma façon de le résoudre.
J'avais quelques enregistrements dans la base de données, je voulais tout purger avant d'écrire de nouvelles données dans la base de données, donc j'ai tout fait, y compris
puis utilisé
managedObjectContext
pour accéder à la base de données (censée être vide à ce jour), les données étaient toujours là. Après un certain temps de dépannage, je trouve que je dois réinitialisermanagedObjectContext
,managedObject
,managedObjectModel
etpersistentStoreCoordinator
, avant de l' utilisermanagedObjectContext
pour accéder au dabase. Maintenant, j'ai une base de données propre à écrire.la source
Voici une version quelque peu simplifiée avec moins d'appels à AppDelegate self et le dernier bit de code qui a été omis de la réponse la mieux notée. De plus, j'obtenais une erreur "Le magasin persistant de l'objet n'est pas accessible à partir du coordinateur de ce NSManagedObjectContext", il fallait donc juste l'ajouter à nouveau.
la source
solution rapide:
la source
let modelURL = NSBundle.mainBundle().URLForResource("some string", withExtension: "momd")!
Comme référence rapide pour enregistrer la recherche ailleurs - recréer le magasin persistant après sa suppression peut être fait avec:
la source
Plusieurs bonnes réponses à cette question. Voici une belle concise. Les deux premières lignes suppriment la base de données sqlite. Ensuite, la boucle for: supprime tous les objets de la mémoire managedObjectContext.
la source
vous pouvez également trouver tous les noms d'entités et les supprimer par leur nom. C'est une version plus longue mais fonctionne bien, de cette façon, vous n'avez pas à travailler avec le magasin de persistance
pour "Any_Entity_Name" donnez simplement n'importe quel nom de votre entité, nous avons seulement besoin de comprendre la description de l'entité dans laquelle se trouvent vos entités. ValueForKey @ "nom" renverra tous les noms d'entité. Enfin, n'oubliez pas de sauvegarder.
la source
La réponse acceptée est correcte avec la suppression de l'URL par NSFileManager est correcte, mais comme indiqué dans la modification iOS 5+, le magasin persistant n'est pas représenté uniquement par un fichier. Pour le magasin SQLite c'est * .sqlite, * .sqlite-shm et * .sqlite-wal ... heureusement depuis iOS 7+ nous pouvons utiliser la méthode
[NSPersistentStoreCoordinator + removeUbiquitousContentAndPersistentStoreAtURL: options: erreur:]
pour prendre soin de la suppression, le code devrait donc ressembler à ceci:
la source
Voici une version qui supprime chaque enregistrement de chaque table que vous avez.
Swift 4
la source
Swift 4/5, iOS 9+
La reconstruction de l'intégralité du
CoreData
fichier SQLite garantira que toutes les données sont effacées, donc toutes les entités sont supprimées. AppelezdeleteAndRebuild()
.la source
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
Une autre méthode (à part une demande de suppression de lot) que j'utilise souvent (en fonction des exigences de l'application) consiste à réinitialiser le magasin persistant. L'implémentation ressemble à ceci pour iOS 10+ et Swift (en supposant que vous avez une classe CoreDataManager):
Un avantage de cette méthode est qu'elle est plus simple, surtout lorsque vous avez des charges d'enregistrement de données pour de nombreuses entités dans vos données de base. Dans ce cas, une demande de suppression de lot nécessiterait beaucoup de mémoire.
la source
Solution Swift 5.1
la source
Supprimer le fichier de magasin persistant et configurer un nouveau coordinateur de magasin persistant?
la source
Supprimez sqlite de votre fichierURLPath, puis générez.
la source
En supposant que vous utilisez
MagicalRecord
et avez un magasin de persistance par défaut:Je n'aime pas toutes les solutions qui supposent que certains fichiers existent et / ou exigent la saisie des noms d'entités ou des classes. Il s'agit d'un Swift (2), un moyen sûr de supprimer toutes les données de toutes les entités. Après sa suppression, il recréera également une nouvelle pile (je ne sais pas vraiment à quel point cette pièce est nécessaire).
C'est godo pour les situations de style "déconnexion" lorsque vous voulez tout supprimer mais que vous avez un magasin de travail et un moc pour obtenir de nouvelles données (une fois que l'utilisateur se connecte ...)
la source
Utilisez ceci
la source
J'ai pris le code de Grouchal et pour l'accélérer j'ai utilisé l'énumération avec le mode simultané (
NSEnumerationConcurrent
), c'est devenu un peu plus rapide que pour la boucle (dans mon application, j'ai ajouté cette fonctionnalité pour les testeurs afin qu'ils puissent effacer les données et faire des tests plutôt que de supprimer et installer l'application)la source
ici ma version swift3 pour supprimer tous les enregistrements. «Utilisateurs» est le nom de l'entité
la source