Ich verwende Core Data, um die Ergebnisse eines Web Services-Aufrufs lokal beizubehalten. Der Webdienst gibt das vollständige Objektmodell für beispielsweise "Autos" zurück - etwa 2000 davon (und ich kann den Webdienst nicht dazu bringen, weniger als 1 oder ALLE Autos zurückzugeben.
Wenn ich meine Anwendung das nächste Mal öffne, möchte ich die Kopie der persistierten Kerndaten aktualisieren, indem ich den Webdienst für alle Fahrzeuge erneut aufrufe. Um jedoch Duplikate zu vermeiden, müsste ich zuerst alle Daten im lokalen Cache löschen.
Gibt es eine schnellere Möglichkeit, ALLE Instanzen einer bestimmten Entität im Kontext des verwalteten Objekts zu löschen (z. B. alle Entitäten vom Typ "CAR"), oder muss ich sie abfragen, dann die Ergebnisse durchlaufen, um sie zu löschen, und dann speichern?
Im Idealfall könnte ich einfach sagen, alle löschen, wo Entität Blah ist.
quelle
Antworten:
iOS 9 und höher:
iOS 9 hat eine neue Klasse namens hinzugefügt
NSBatchDeleteRequest
, mit der Sie Objekte, die einem Prädikat entsprechen, einfach löschen können, ohne sie alle in den Speicher laden zu müssen. So würden Sie es verwenden:Swift 5
Ziel c
Weitere Informationen zum Löschen von Stapeln finden Sie in der Sitzung "Was ist neu in den Kerndaten?" Der WWDC 2015 (ab ca. 14: 10 Uhr ).
iOS 8 und früher:
Holen Sie sie alle und löschen Sie sie alle:
quelle
Entität in Swift 3 zurücksetzen :
quelle
Ein bisschen sauberer und universeller: Fügen Sie diese Methode hinzu:
quelle
Für Swift 2.0:
quelle
Schnell:
quelle
Dies ist eine ähnliche Frage wie hier, und jemand hat vorgeschlagen, eine Regel zum Löschen von Beziehungen einzurichten, sodass Sie nur ein Objekt löschen müssen. Wenn Sie also eine Entität mit einer zu vielen Beziehung zu den Autos haben oder erstellen können und die Löschregel auf Kaskade setzen, wenn Sie die höhere Entität löschen, werden auch alle Autos gelöscht. Dies kann einige Verarbeitungszeit sparen, da Sie nicht die Schritte ausführen müssen, die zum Laden ALLER Autos erforderlich sind. In einem größeren Datensatz kann dies unbedingt erforderlich sein.
quelle
Eine gute Antwort wurde bereits gepostet, dies ist nur eine Empfehlung!
Ein guter Weg wäre, einfach eine Kategorie hinzuzufügen
NSManagedObject
und eine Methode zu implementieren, wie ich es getan habe:Header-Datei (zB
NSManagedObject+Ext.h
)Codedatei: (zB NSManagedObject + Ext.m)
... das einzige, was Sie tun müssen, ist, den manageObjectContext vom App-Delegaten abzurufen, oder wo jeder, in dem Sie ihn haben;)
danach können Sie es verwenden wie:
Eine weitere Optimierung könnte darin bestehen, dass Sie den Parameter für den Entitätsnamen entfernen und stattdessen den Namen aus dem Clazznamen abrufen. Dies würde zur Verwendung führen:
ein saubereres Impl (als Kategorie zu NSManagedObjectContext):
Die Verwendung dann:
quelle
[AppDelegate managedObjectContext]
ist nicht unbedingt eine "saubere Architektur" .. ;-)deleteAllFromEntity: inManagedObjectContext:
Swift 4, iOS 12 und Xcode 10 Update
100% arbeiten nur ausschneiden und einfügen
Fügen Sie diese Funktion einfach in die entsprechende Klasse ein und rufen Sie diese Funktion
self.deleteData()
inviewDidLoad()
oder an einer beliebigen Stelle oder unter einer Funktion oder einer Schaltfläche auf, sodass durch Klicken auf eine Schaltfläche alle Daten aus der Entität gelöscht werden sollen, und ersetzen Sie die "myEntity" als Ihre Entität, die Sie in Ihrer definiert haben Kerndateiquelle
Swift 3.X und Swift 4.X , einfache Möglichkeit. Ändern Sie nur Ihre Tabelle
quelle
iOS 10 und höher
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
CoreDataStack()
oderDataController()
Klassen sind. Ein Update wäre dankbar;)Erweiterung der Antwort von Dave Delong.
Schnelle Version, die sich auch um iOS 9 und frühere Versionen kümmert. Ich habe auch die Fehlerbehandlung darin behandelt:
let appDelegate: AppDelegate = UIApplication.sharedApplication (). delegate as! AppDelegate
quelle
Warum falten Sie nicht die Daten ein, die Sie mit dem vorhandenen Cache erhalten? Andernfalls wird es nicht wirklich "aktualisiert", sondern "erneut gestartet". Sie können die SQLLite-Datei auch löschen / löschen und erneut starten (vorausgesetzt, Sie behalten nicht auch andere Daten bei).
quelle
Swift 4, iOS 10+
Statische Funktion, die für jede Entität gelten kann, um alle ihre Daten zu entfernen
'Raum' ist eine Einheit
Bearbeitet am 20191025: Die Anweisung "Self.fetchRequest ()" kann Probleme verursachen, wenn wir mehrere Ziele in denselben Projekten verwenden. Also ersetzt durch NSFetchRequest (entityName: String (Beschreibung: self))
quelle
Wenn die Entität viele Einträge enthält, ist dies am besten so, da dadurch Speicherplatz gespart wird
quelle
In Swift 3.0
quelle
Dieser Code funktioniert sowohl für iOS 9 als auch darunter
quelle
iOS 9.0 und höher:
NSBatchDeleteRequest
wird verwendet, um Datensätze in Kerndaten zu löschen. Es funktioniert sehr schnell und benötigt weniger Zeit, um alle Datensätze aus einer Entität zu löschen. Es erfordertNSFetchRequest
in Argument. Wenn Sie alle Datensätze aus einer Entität löschen möchten, können Sie sie verwenden und es funktioniert für mich.quelle
Schnelle Bereinigung aller Objekte in DB:
quelle
Dave Delongs 'Swift 2.0-Antwort stürzte für mich ab (in iOS 9)
Aber das hat funktioniert:
quelle
Swift 3-Lösung mit iOS 9 'NSBatchDeleteRequest' und Fallback auf frühere iOS-Versionen, die als Erweiterung von 'NSManagedObjectContext' implementiert wurden. Apple-Referenz https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html
quelle
Verwenden Sie NSBatchDeleteRequest, um mehrere Datensätze zu löschen, wenn iOS mindestens 9.0 ist. Wenn Sie einen Hintergrund-Thread haben, führen Sie NSManagedObjectContext save aus. Andernfalls verwenden Sie NSFetchRequest, um Datensätze abzurufen und alle Datensätze in der for-Schleife zu löschen. Speichern Sie nach dem Löschen.
quelle
in iOS 11.3 und Swift 4.1
Sie müssen reset aufrufen, nachdem Sie ausgeführt haben. Wenn nicht, wird es in der Tabellenansicht nicht aktualisiert.
quelle
quelle
die OOP-Methode ohne Zeichenfolgen als Entitätsnamen Swift 3+, Xcode 10+
dann rufe einfach do / catch block auf
quelle
In Swift 2.0:
quelle