Ich habe eine Kontakttabelle und eine Lokalisierungstabelle mit vielen Orten für jeden Kontakt
Ich erstelle einen Kontakt speichern und dann einen Standort erstellen und speichern und dann den gespeicherten Standort dem Kontakt zuweisen. Code unten:
%Vor%Ich habe nur einen Standort hinzugefügt. Wenn ich jedoch die Kontakteinheit drucke, sehe ich zwei zugewiesene Standorte, wie Sie unten sehen können.
%Vor%Außerdem hat eine der Positionsentitäten die Werte der zugewiesenen Attribute korrekt, während die andere Positionsentität alle Nullwerte hat.
Das vermasselt mein Programm. Wenn ich in einer Schleife über Standort-Entitätsattribute gehe, um sie zu löschen, sehe ich jetzt drei Standort-Entitäten
%Vor%Ausgabe: Anzahl der zu löschenden Orte :: 3
Im späteren Teil meines Codes, wenn ich versuche, Werte abzurufen, stürzt er ab, weil alle Attribute der zwei zusätzlichen Standort-Entitäten alle null sind.
Meine Frage: Da ich nur eine Location-Entität hinzugefügt habe, sollte es nur eine Location-Entität geben, und diese sollte die einzige sein, die mit Contact verknüpft ist. Es zeigt zwei Orte an, die dem Kontakt zugewiesen sind, und wenn ich gezählt werde, habe ich drei Standorte. Sieht so aus, als würden Standort-Entities mit Null-Attributen automatisch hinzugefügt.
Ich bin verwirrt. Kann jemand helfen?
Wahrscheinlich rufen Sie saveLocation
in einigen Situationen auf, in denen entweder der Abruf fehlschlägt oder keine Ergebnisse mit dem Prädikat übereinstimmen, und saveLocation
behandelt diese Situationen nicht ordnungsgemäß.
init(context:)
Dieser Initialisierer auf NSManagedObject
erstellt nicht nur ein leeres Location
-Objekt im Speicher, wenn Sie Location(context: context)
aufrufen, sondern fügt dieses Objekt auch in den verwalteten Objektkontext ein, den Sie übergeben haben. Sobald saveContext()
aufgerufen wird, wird das Location
-Objekt (das leer ist, wenn es nicht weiter bearbeitet wird) beibehalten.
Während init (context :) nicht gut dokumentiert ist, scheint Apple darauf hingewiesen zu haben Das funktioniert genauso wie init (entity: insertInto :) , außer dass die Entity automatisch berechnet wird aus.
saveLocation(:)
In dieser Funktion haben Sie Ihr Location
-Objekt ...
... bevor Sie überprüfen, ob% code_de vorhanden ist, und die Eigenschaften festlegen.
%Vor% Wenn also der Abruf fehlschlägt oder der Abruf mit 0 Ergebnissen zurückkehrt, bleibt das leere Contact
-Objekt, das beim Aufruf des Initialisierers erstellt wurde, im Kontext und wird beim nächsten Aufruf von% co_de beibehalten %.
In diesem speziellen Fall werden Sie wahrscheinlich feststellen, dass Ihr Problem nach dem Verschieben dieser Zeile gelöst wird.
%Vor% zum Location
-Block unten:
Als allgemeine Regel, die dieses Problem bei der Verwendung von Core Data verhindert, verwenden Sie saveContext()
für keine if let
-Unterklasse, es sei denn, Sie haben zuerst alle erforderlichen Prüfungen durchgeführt und sind sicher, dass das Element sofort in den Kontext eingefügt werden soll .