Kennen Sie eine Möglichkeit, alle in Core Data gespeicherten Einträge zu löschen? Mein Schema sollte gleich bleiben; Ich möchte es nur auf leer zurücksetzen.
Bearbeiten
Ich möchte dies programmgesteuert tun, damit ein Benutzer im Wesentlichen eine reset
Taste drücken kann.
ios
cocoa
cocoa-touch
core-data
nsmanagedobject
Michael Grinich
quelle
quelle
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880Antworten:
Sie können die Datei weiterhin programmgesteuert mit der Methode NSFileManager: removeItemAtPath :: löschen.
Fügen Sie dann einfach den persistenten Speicher wieder hinzu, um sicherzustellen, dass er ordnungsgemäß neu erstellt wird.
Die programmatische Methode zum Durchlaufen jeder Entität ist sowohl langsamer als auch fehleranfällig. Auf diese Weise können Sie einige Entitäten löschen und andere nicht. Sie müssen jedoch weiterhin sicherstellen, dass Sie die referenzielle Integrität beibehalten, da Sie Ihre Änderungen sonst nicht beibehalten können.
Das Entfernen und Neuerstellen des Speichers ist schnell und sicher und kann zur Laufzeit programmgesteuert durchgeführt werden.
Update für iOS5 +
Mit der Einführung eines externen Binärspeichers (ermöglicht ExternalBinaryDataStorage oder Store in External Record File) in iOS 5 und OS X 10.7 reicht es nicht aus, nur Dateien zu löschen, auf die storeURLs verweisen. Sie lassen die externen Datensatzdateien zurück. Da das Namensschema dieser externen Datensatzdateien nicht öffentlich ist, habe ich noch keine universelle Lösung. - an0 8. Mai 12 um 23:00 Uhr
quelle
Sie können die SQLite-Datei löschen - aber ich entscheide mich dafür, indem ich die Tabellen einzeln mit folgenden Funktionen lösche:
Der Grund, warum ich mich für Tabelle für Tabelle entschieden habe, ist, dass ich bei der Programmierung bestätige, dass das Löschen des Inhalts der Tabelle sinnvoll ist und es keine Daten gibt, die ich lieber behalten möchte.
Dies zu tun ist viel langsamer als nur das Löschen der Datei und ich werde zu einem Löschen von Dateien wechseln, wenn diese Methode zu lange dauert.
quelle
Aktualisierte Lösung für iOS 10+
Verwenden Sie
NSBatchDeleteRequest
diese Option, um alle Objekte in der Entität zu löschen, ohne sie in den Speicher laden oder durchlaufen zu müssen.Dieser Code wurde für iOS 10 und Swift 3 aktualisiert. Wenn Sie iOS 9 unterstützen müssen, lesen Sie diese Frage .
Quellen:
quelle
moc.performBlockAndWait({ () -> Void in
...})
.Ich habe eine
clearStores
Methode geschrieben, die jeden Speicher durchläuft und sowohl vom Koordinator als auch vom Dateisystem löscht (Fehlerbehandlung beiseite gelassen):Diese Methode befindet sich in einer
coreDataHelper
Klasse, die sich unter anderem darum kümmert, den persistentStore zu erstellen, wenn er gleich Null ist.quelle
Ich entferne alle Daten aus den Kerndaten einer Schaltfläche Ereignis in einer HomeViewController-Klasse: Dieser Artikel hat mir so sehr geholfen, dass ich dachte, ich würde einen Beitrag leisten.
Beachten Sie, dass ich zum Aufrufen von self.persistentStoreCoordinator eine Eigenschaft im Home View Controller deklariert habe. (Machen Sie sich keine Sorgen über den verwalteten Objekttext, den ich zum Speichern und Laden verwende.)
Dann in der AppDelegate ApplicationDidFinishLaunching rechts unten einen HomeViewController erstellen, den ich habe:
quelle
MagicalRecord macht dies sehr einfach.
quelle
MR_truncateAll
?iOS9 +, Swift 2
Löschen Sie alle Objekte in allen Entitäten
quelle
[Späte Antwort als Antwort auf ein Kopfgeld, das nach neueren Antworten fragt]
Blick auf frühere Antworten,
Es gibt jedoch einen anderen, ähnlichen Ansatz zum Entfernen des dauerhaften Speichers, der funktioniert. Der Schlüssel besteht darin, Ihre persistente Speicherdatei in einem eigenen Unterverzeichnis abzulegen, das nichts anderes enthält. Stecken Sie es nicht einfach in das Dokumentenverzeichnis (oder wo auch immer), sondern erstellen Sie ein neues Unterverzeichnis nur für den persistenten Speicher. Der Inhalt dieses Verzeichnisses ist letztendlich die persistente Speicherdatei, die Journaldateien und die externen Binärdateien. Wenn Sie den gesamten Datenspeicher zerstören möchten, löschen Sie dieses Verzeichnis, und alle verschwinden.
Sie würden so etwas tun, wenn Sie Ihren dauerhaften Speicher einrichten:
Wenn Sie dann den Laden entfernen wollten,
Dadurch werden sowohl das benutzerdefinierte Unterverzeichnis als auch alle darin enthaltenen Core Data-Dateien rekursiv entfernt.
Dies funktioniert nur, wenn sich Ihr persistenter Speicher nicht bereits im selben Ordner wie andere wichtige Daten befindet . Wie das Dokumentenverzeichnis, das wahrscheinlich andere nützliche Dinge enthält. Wenn das Ihre Situation, könnte man den gleichen Effekt durch die Suche nach Dateien, die Sie tun behalten wollen und alles andere zu entfernen. Etwas wie:
Dieser Ansatz kann fehleranfällig sein . Sie müssen absolut sicher sein, dass Sie jede Datei kennen, die Sie behalten möchten, da Sie sonst möglicherweise wichtige Daten entfernen. Auf der anderen Seite können Sie die externen Binärdateien entfernen, ohne den Datei- / Verzeichnisnamen zu kennen, in dem sie gespeichert wurden.
quelle
Hier ist eine kombinierte Lösung zum Löschen von Kerndaten.
quelle
Wenn Sie alle Objekte löschen und die Sicherungsdateien nicht löschen möchten, können Sie folgende Methoden verwenden:
Beachten Sie, dass es sehr langsam sein kann (hängt davon ab, wie viele Objekte sich in Ihrem Objektdiagramm befinden).
quelle
Wenn Sie die Route zum Löschen aller Objekte ausführen möchten (was viel einfacher ist als das Herunterfahren des Kerndatenstapels, aber weniger leistungsfähig), ist dies eine bessere Implementierung:
Diese Implementierung nutzt
NSOperation
das Löschen des Hauptthreads und die Benachrichtigung nach Abschluss. Möglicherweise möchten Sie eine Benachrichtigung oder etwas innerhalb des Abschlussblocks ausgeben, um den Status zurück zum Haupt-Thread zu leiten.quelle
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
muss, um diese Methode zu verwenden. Andernfalls wird der folgende Fehler angezeigt :Can only use -performBlock: on an NSManagedObjectContext that was created with a queue.
iOS 10 + Swift 3-Lösung:
Durchläuft alle Kerndatenentitäten und löscht sie
quelle
Danke für den Beitrag. Ich folgte ihm und es funktionierte für mich. Aber ich hatte ein anderes Problem, das in keiner der Antworten erwähnt wurde. Ich bin mir also nicht sicher, ob es nur ich war.
Wie auch immer, ich dachte, ich würde hier das Problem und meinen Weg, der es gelöst hat, posten.
Ich hatte ein paar Datensätze in der Datenbank, ich wollte alles bereinigen, bevor ich neue Daten in die Datenbank schreibe, also habe ich alles getan, einschließlich
und dann verwendet,
managedObjectContext
um auf die Datenbank zuzugreifen (soll jetzt leer sein), irgendwie waren die Daten noch da. Nach einer gewissen Zeit der Fehlersuche, fand ich , dass ich zurücksetzen müssenmanagedObjectContext
,managedObject
,managedObjectModel
undpersistentStoreCoordinator
, bevor ichmanagedObjectContext
die dabase zuzugreifen. Jetzt habe ich eine saubere Datenbank zum Schreiben.quelle
Hier ist eine etwas vereinfachte Version mit weniger Aufrufen von AppDelegate self und dem letzten Code, der in der am besten bewerteten Antwort nicht berücksichtigt wurde. Außerdem wurde die Fehlermeldung "Der persistente Speicher des Objekts ist über den Koordinator dieses NSManagedObjectContext nicht erreichbar" angezeigt, sodass ich ihn nur wieder hinzufügen musste.
quelle
schnelle Lösung:
quelle
let modelURL = NSBundle.mainBundle().URLForResource("some string", withExtension: "momd")!
Als Kurzreferenz zum Speichern der Suche an anderer Stelle können Sie den dauerhaften Speicher nach dem Löschen neu erstellen:
quelle
Mehrere gute Antworten auf diese Frage. Hier ist eine schöne, prägnante. Die ersten beiden Zeilen löschen die SQLite-Datenbank. Anschließend löscht die for: -Schleife alle Objekte im ManagedObjectContext-Speicher.
quelle
Sie können auch alle Entitätsnamen finden und nach Namen löschen. Es ist eine längere Version, funktioniert aber gut, so dass Sie nicht mit dem Persistenzspeicher arbeiten müssen
Geben Sie für "Any_Entity_Name" nur einen Namen Ihrer Entität an. Wir müssen nur die Entitätsbeschreibung herausfinden, in der sich Ihre Entitäten befinden. ValueForKey @ "name" gibt alle Entitätsnamen zurück. Vergessen Sie nicht zu speichern.
quelle
Die akzeptierte Antwort ist korrekt, wenn das Entfernen der URL durch NSFileManager korrekt ist. Wie in der Bearbeitung von iOS 5+ angegeben, wird der persistente Speicher jedoch nicht nur durch eine Datei dargestellt. Für den SQLite-Speicher sind es * .sqlite, * .sqlite-shm und * .sqlite-wal ... zum Glück können wir seit iOS 7+ die Methode verwenden
[NSPersistentStoreCoordinator + removeUbiquitousContentAndPersistentStoreAtURL: options: error:]
Um sich um das Entfernen zu kümmern, sollte der Code ungefähr so aussehen:
quelle
Swift 4/5, iOS 9+
Durch die Neuerstellung der gesamten
CoreData
SQLite-Datei wird sichergestellt, dass alle Daten gelöscht werden. Daher werden alle Entitäten gelöscht. Rufen Sie einfach andeleteAndRebuild()
.quelle
Funktioniert mit allen Versionen. Übergeben Sie den Entitätsnamen und durchlaufen Sie ihn, um alle Einträge zu löschen und den Kontext zu speichern.
quelle
Hier ist eine Version, die jeden Datensatz in jeder Tabelle löscht, die Sie haben.
Swift 4
quelle
Eine andere Methode (abgesehen von einer Batch-Anforderung zum Löschen), die ich häufig verwende (basierend auf den App-Anforderungen), ist das Zurücksetzen des persistenten Speichers. Die Implementierung sieht für iOS 10+ und Swift folgendermaßen aus (vorausgesetzt, Sie haben eine CoreDataManager-Klasse):
Ein Vorteil dieser Methode besteht darin, dass sie einfacher ist, insbesondere wenn Sie eine Vielzahl von Datensätzen für zahlreiche Entitäten in Ihren Kerndaten haben. In diesem Fall wäre eine Anforderung zum Löschen eines Stapels speicherintensiv.
quelle
Swift 5.1 Lösung
quelle
Die persistente Speicherdatei löschen und einen neuen persistenten Speicherkoordinator einrichten?
quelle
Löschen Sie SQLite aus Ihrer DateiURLPath und erstellen Sie es.
quelle
Angenommen, Sie verwenden
MagicalRecord
und haben einen Standard-Persistenzspeicher:Ich mag nicht alle Lösungen, die davon ausgehen, dass bestimmte Dateien vorhanden sind und / oder die Eingabe der Entitätsnamen oder -klassen erfordern. Dies ist eine schnelle und sichere Methode zum schnellen Löschen aller Daten aus allen Entitäten. Nach dem Löschen wird auch ein neuer Stapel neu erstellt (ich bin mir eigentlich nicht sicher, wie wichtig dieser Teil ist).
Es ist ideal für Situationen im "Logout" -Stil, in denen Sie alles löschen möchten, aber einen funktionierenden Speicher und einen Moc haben, um neue Daten zu erhalten (sobald sich der Benutzer anmeldet ...).
quelle
Benutze das
quelle
Ich habe Grouchals Code genommen und um ihn zu beschleunigen, habe ich die Aufzählung mit dem gleichzeitigen Modus (
NSEnumerationConcurrent
) verwendet. Sie wurde im Vergleich zur for-Schleife etwas schneller (in meiner App habe ich diese Funktion für Tester hinzugefügt, damit sie Daten löschen und Testfälle ausführen können, anstatt und zu löschen App installieren)quelle
hier meine swift3 version zum löschen aller aufzeichnungen. 'Benutzer' ist der Entitätsname
quelle