Ich führe Unique Constraints zu einer bestehenden App, in einer neuen Modellversion.Core Data Unique Constraints - "Dangling Verweis auf ein ungültiges Objekt" auf Speichern
Das Modell hat die Entität Person, die eine optionale Eins-zu-Eins-Beziehung mit Entität Pet hat. Die Löschregel der Person ist eine Kaskade, und die Regel zum Löschen der umgekehrten Beziehung von Pet wird aufgehoben. Es gibt eine andere Entität, Job, bei der Person auch eine direkte Beziehung hat. Diese Löschregel und die Regel für die inverse Löschung werden jedoch beide aufgehoben.
Person hat eine "personID" -Eigenschaft, die ich einzigartig gemacht habe.
In einem Hauptwarteschlangenkontext habe ich eine Instanz von Person mit ID xxx, die kein Pet-Set hat. Lassen Sie uns diese Person "Charlie" nennen. Ich erstelle auch einen Job und stelle ihn als "iOS Dev" ein und weise ihn Charlie's Job-Eigenschaft zu.
Dann in einen Child Private Queue-Kontext, ich füge ein neues "Charlie" auch mit ID xxx (die einzigartige Einschränkung) und erstellen Sie ein Pet und legen Sie es fest. Ich stelle keinen Job ein. Ich speichere den Child-Kontext ohne Probleme.
Unmittelbar danach versuche ich den Hauptwarteschlangenkontext zu speichern. Aber kurz zuvor prüfe ich die Eigenschaft insertedObjects des Hauptwarteschlangenkontextes und sehe erwartungsgemäß eine Instanz von Person mit ID xxx. Was ich erwarte, ist, dass diese zweite Instanz von eindeutigen Einschränkungen gehandhabt wird und mit der ursprünglichen Instanz von Person aus dem vorherigen Absatz "verschmolzen" wird. Aber, wenn ich das Speichern des MOC tatsächlich aufrufen: Methode, wirft es eine Ausnahme und ich inspizieren das NSError Objekt:
Fehler Domain = NSCocoaErrorDomain-Code = 1550 „Die Operation nicht abgeschlossen sein könnte (Cocoa Fehler 1550. zu einem ungültigen Objekt.)“Userinfo = {Schlenker Referenz. = null
Irgendwelche Ideen, wie die Ausnahme zu vermeiden? Ich bin es gewohnt, in Core Data "Dangling Referenzen" zu haben, was bedeutet, dass eine Beziehung falsch konfiguriert ist, aber ich habe es einige Male durchgelesen und es sieht gut aus, also bin ich mir nicht sicher, was ich sonst noch angehen sollte. Ich verwende alle Kontexte, die die NSMergeByPropertyObjectTrompMergePolicy-Merge-Richtlinie verwenden.
Offensichtlich ist dies ein wenig schwer zu folgen, so warf ich ein Beispielprojekt auf Github, falls jemand up interessiert: https://github.com/bpapa/core-data-unique-bug
In meinem Fall hat ein Upgrade auf Xcode 8.2 das Problem verschwinden lassen! – bruce1337
Das ist gut zu hören. In meiner App habe ich festgestellt, dass das Schreiben meiner eigenen Merge-Richtlinie das Problem nicht gelöst hat. Deshalb habe ich mich einfach von der Unique-Funktion entfernt, die viel zusätzlichen Code zum Erstellen oder Aktualisieren erfordert und sich auch anstellen muss meine Operationen, die in Kerndaten speichern. Hoffentlich kann ich das irgendwann noch einmal Revue passieren lassen. – bpapa
Ich muss meinen freudigen Kommentar vom 29. Oktober zurückziehen - dieses Problem ist mit einer Rache zurückgekommen und ich glaube jetzt, dass der 1550-Dangling-Referenzfehler nur scheinbar verschwunden zu sein schien, weil ich den Inhalt auf dem Simulator zurückgesetzt hatte. In meinem Fall erhalte ich 1550, wenn mein Inhalt vom Server aktualisiert wird und meine App versucht, vorhandene Objekte in Core Data zu aktualisieren. Ich benutze jetzt Release-Version 8.2 und versuche immer noch, mein Problem zu lösen, vorausgesetzt, es ist immer noch nicht aufgrund eines Fehlers in Xcode. – bruce1337