Ich habe eine App, mit der Benutzer Favoriten speichern können. Ich verwende Core Data, um die Favoriten als verwaltete Objekte zu speichern. Ich habe Code geschrieben, um die Möglichkeit zu vermeiden, Duplikate zu speichern, aber ich frage mich, ob es einen besseren Weg gibt, dies zu tun. Jedes Lieblingsobjekt hat ein ID-Feld, das eindeutig ist. Im folgenden Code werde ich einfach das ID-Feld durchlaufen und prüfen, und wenn der Wert bereits existiert, einen Flag-Wert auf "true" setzen und aus der Schleife ausbrechen.
%Vor%Ich habe mich gefragt, ob Core Data prüfen kann, ob ein hinzugefügtes Objekt ein Duplikat ist. Gibt es ein Prädikat, mit dem Duplikate überprüft werden können? Danke!
CoreData führt kein Alleinstellungsmerkmal aus. Es hat keine Ahnung, dass zwei Einträge identisch sind.
Um ein solches Verhalten zu ermöglichen, müssen Sie es selbst implementieren, indem Sie eine 'Suche vor dem Einfügen' aka 'Fetch vor dem Erstellen' durchführen.
%Vor%Ich habe mich gefragt, ob Core Data prüfen kann, ob ein hinzugefügtes Objekt ein Duplikat ist.
Nein, Core Data kümmert sich nicht darum.
Gibt es ein Prädikat, das die Prüfung auf Duplikate verarbeiten kann?
Da Ihre Objekte eindeutige IDs haben, die Sie steuern, führen Sie einen Abruf für einen vorhandenen Favoriten mit dieser ID durch. Etwas wie
%Vor%Wenn Sie irgendwelche Ergebnisse erhalten, wissen Sie, dass ein Favorit mit dieser ID bereits existiert. Und Sie haben einen Bezug auf diesen Favoriten, falls Sie ihn ändern möchten.
Ihr aktueller Ansatz ist in Ordnung und wahrscheinlich schneller, wenn es nur wenige Favoriten gibt. Ein Fetch wird besser auf viele Favoriten skaliert.
Nur ein Update seit iOS 9.0 können Sie einfach mit "einzigartigen Einschränkungen" im Modell machen. Aber achten Sie darauf, wenn Ihr Geschäft bereits doppelte Stammdaten enthält, wird eine automatische Migration fehlschlagen, wenn die App ausgeliefert wurde.
Siehe hier zum Beispiel - eindeutige Beschränkungen für Kerndaten
Wenn Sie mit mehreren Datensätzen arbeiten, ist das Iterieren über ein Zählen oder Abrufen tatsächlicher Objekte auf der CPU sehr kostspielig. In meinem Fall habe ich einen Fetch für alle übereinstimmenden Datensätze ausgeführt, aber nach einem Wörterbuch nur der Zeichenfolge der UUID zurück gefragt. Spart viel CPU-Overhead.
Zum Beispiel habe ich eine UUID-Eigenschaft für jeden Datensatz in Core-Daten. Ich habe eine entsprechende UUID als @ "UUID" in CloudKit aufgeführt.
%Vor%Das Konsolenprotokoll des Wörterbuchs sieht ungefähr so aus. Nur die kleinste Menge an Informationen benötigt, um zu entsprechen:
%Vor%Mehr hier auf der Entwicklerseite zum Finden von Unique Werte.
Tags und Links objective-c ios xcode core-data