Dies ist die Übersicht meines Problems:
Ich füge (und bestätige, dass sie hinzugefügt werden) etwa 1400 Beziehungen, die von einem Soap-Service in CoreDat geladen wurden. Nachdem ich die App geschlossen und wieder geöffnet habe, gehen einige der Beziehungen verloren. Ich sehe nur ungefähr 800 von ihnen (obwohl es variiert). Außerdem bekomme ich keine Fehler.
Und jetzt, mehr Details:
Ich habe ein Objekt namens User
, das Informationen über Dienste enthält, die ein Benutzer gespeichert hat; Es sieht ungefähr so aus:
In dem Teil des Codes, in dem die Daten verwendet werden, werden die Beziehungen wie folgt gespeichert:
%Vor%Der Fall ist, dass ich mit dem Debugger überprüft habe, und ich kann sehen, dass alle über 1400 Beziehungen hinzugefügt werden, aber wenn die App zurückgesetzt wird und sie durch selb.user.services wiederhergestellt werden, bekomme ich nur rund 800 Objekte.
Warum könnte das passieren? Hat jemand das schon mal gehabt?
Vielen Dank im Voraus.
UPDATE:
Die Leute schlagen vor, dass ich Core Data nicht korrekt verwende, aber das Problem ist, dass die Daten nach dem Neustart der App verloren gehen. Es gibt absolut kein Problem damit. Ich verwende Core Data so korrekt, wie es die begrenzte Dokumentation und die Beispiele, die Sie von Apple erhalten, erhalten könnte.
Kann das nicht tun. self.user.services
gibt keine änderbare Menge zurück. Dafür ist die Methode addServicesObject
zuständig. Ändern Sie die zweite Zeile in:
Aus Apple-Dokumentation:
Es ist wichtig, den Unterschied zwischen den vom Punktaccessor zurückgegebenen Werten und
mutableSetValueForKey:
zu verstehen.mutableSetValueForKey:
gibt ein veränderbares Proxy-Objekt zurück. Wenn Sie den Inhalt mutieren, werden entsprechende Benachrichtigungen für die Schlüsselwertbeobachtung (KVO) für die Beziehung ausgegeben. Der Punktaccessor gibt einfach einen Satz zurück. Wenn Sie die Menge wie in diesem Codefragment ändern:
[aDepartment.employees addObject:newEmployee]; // do not do this! then KVO change notifications are not emitted and the inverse relationship is not updated correctly.
Erinnern Sie sich, dass der Punkt einfach die Accessor-Methode aufruft, also aus den gleichen Gründen:
[[aDepartment employees] addObject:newEmployee]; // do not do this, either!
Okay, schauen wir uns die Symptome hier an. Sie nehmen Änderungen an Objekten in einem Kontext vor, aber wenn Sie die App neu starten, sind einige, aber nicht alle dieser Änderungen vorhanden.
Dies kann nur bedeuten, dass diese Änderungen nicht in den persistenten Speicher geschrieben werden. Da Sie einige der Änderungen sehen, rufen Sie die Methode save:
auf, aber Core Data erkennt nicht alle Objekte, die gespeichert werden müssen.
Dies führt uns dazu, wie Sie die Änderungen an diesen Objekten durchführen. Nehmen Sie die Änderungen KVO-konform vor? Core Data verlässt sich auf KVO, um zu wissen, welche Änderungen aufgetreten sind und welche Änderungen daher bestehen bleiben müssen. Wenn Sie die Objekte nicht auf KVO-Basis ändern, werden sie scheinbar geändert, wenn Sie sie untersuchen, aber Core Data weiß nicht, dass diese Änderungen vorhanden sind, und wissen daher nicht, dass sie beibehalten werden müssen.
Ich würde Ihren Code wie folgt ändern, vorausgesetzt, das Objekt Service
hat die umgekehrte Beziehung zurück zum User
(und diese Beziehung heißt user
und Teil eines 1-M):
Dies beruht auf der Tatsache, dass Core Data beide Enden der Beziehung für Sie übernimmt, wo eine inverse Beziehung eingerichtet wird. Wenn es sich um eine Viele-zu-Viele-Beziehung handelt, ist der Code natürlich etwas anders, aber wir verwenden immer noch die KVO-konformen Methoden, um die Änderungen vorzunehmen.
%Vor% Am Ende habe ich es gelöst, indem ich eine benutzerdefinierte NSPredicate
verwende, die die Dienste unter Verwendung eines speziellen Parameters, den ich für Dienste festlege, wenn sie von einem Benutzer hinzugefügt werden, abruft.
Es funktioniert, obwohl es nicht ideal ist.
Ich hatte das gleiche Problem, dass die Beziehung zu einer anderen Entität jedes Mal verloren ging, wenn ich die App neu starte. Ich habe stundenlang gesucht. Am Ende habe ich das Problem gefunden.
Ich habe meine Beziehung als Transient
deklariert, dies hat das Problem verursacht.
Tags und Links objective-c iphone persistence core-data