Ich bin neu bei Core Data und versuche sicherzustellen, dass ich mein Datenmodell und seine Verwendung richtig eingerichtet habe.
Ich habe im Grunde zwei Dateitypen in meiner App ... eine enthält Daten des Typs Einstellungen und eine zweite enthält Datensätze, mit denen der Benutzer arbeiten wird (ähnlich wie Dokumente, obwohl ich mir vorstellen kann, dass der Benutzer mit 10 oder sogar 100 dieser Dateien gleichzeitig arbeitet).
Ich habe Bücher über Kerndaten gelesen, und ich erinnere mich, dass ich gelesen habe, dass eine App typischerweise eine einzige NSPersistentStoreCoordinator
eine einzige NSManagedObjectContext
und eine einzige NSManagedObjectModel
.
Ich habe derzeit ein einzelnes verwaltetes Objektmodell mit Konfigurationen für die verschiedenen Dateitypen, die ich habe. Ich hatte geplant, auch eine der NSPersistentStoreCoordinators
/ NSManagedObjectContexts
und wenn ich neue Kerndatenobjekte erstelle, würde ich sicherstellen, dass jedes Objekt dem richtigen persistenten Speicher hinzugefügt wird.
Ich habe jedoch Beispiele gesehen, bei denen jede Datei eine eigene NSPersistentStoreCoordinator
y NSManagedObjectContext
.
Gibt es Vor- und Nachteile, wenn man mehrere Personen hat? NSPersistentStoreCoordinators
y NSManagedObjectContexts
in einer Single-Thread-Anwendung?
Ursprünglich hatte ich gehofft, Objekte während der Bearbeitung durch den Benutzer per Ausschneiden und Einfügen von einem dauerhaften Speicher in einen anderen verschieben zu können, aber das scheint so oder so nicht möglich zu sein.
Jeder Ratschlag ist sehr willkommen!
bearbeiten
Hier finden Sie weitere Informationen darüber, was mich verwirrt. Wenn ich die Dokumentation über NSPersistentStoreCoordinator lese, steht dort:
Der Koordinator soll Folgendes präsentieren eine Fassade für das verwaltete Objekt Kontexten eine Fassade zu bieten, so dass eine Gruppe von persistenten Gesamtspeicher erscheint.
In meinem Fall ist das nicht das, was ich will. Ich möchte, dass meine Dokumente als separate Dokumente wahrgenommen werden, und ich möchte nicht, dass die Abfragen miteinander verwechselt werden.
Wenn ich bei nur einem Koordinator für persistente Speicher und vielen persistenten Speichern vergesse, eine Entität bei der Erstellung dem richtigen Speicher zuzuordnen, treten Fehler auf, da Entitäten bei ihrer Erstellung willkürlich einem gültigen Speicher zugeordnet werden. Ich bin mir nicht sicher, was mit Beziehungen passieren würde, die auf Objekte in verschiedenen Speichern verweisen (wahrscheinlich ein Assertion-Fehler?).
Mir scheint, dass ein einziger Kontext / persistenter Speicherkoordinator pro Speicher weniger anfällig für Fehler ist und es mir ermöglicht, die Daten für jedes Dokument voneinander isoliert zu halten.
Das Einzige, was mir ein einzelner persistenter Speicher zu bringen scheint, ist, dass ich einen Speichervorgang für alle Speicher gleichzeitig durchführen kann, was vorzuziehen wäre. Mit mehreren Kontexten/Speicher-Koordinatoren müsste ich separate Speichervorgänge durchführen.
Wenn Sie die OSX NSPersistentDocument-Klasse verwenden, scheint sie einen separaten Kontext/Speicher-Koordinator pro Dokument zu erzwingen.
Wie auch immer, aus all meinen Recherchen, scheint es, dass separate Store-Koordinatoren / Kontexte besser für meine App funktionieren würde, aber der Grund, warum ich dies gepostet ist, weil ich bin neu in Core Data und dieser Ansatz scheint gegen den empfohlenen Fluss zu gehen und ich bin besorgt, dass ich einige gotchas, die zurück kommen, um mich zu beißen übersehen bin.
Weitere Überlegungen/Informationen
Während ich weiter darüber nachdenke und mehr Rückmeldungen von anderen lese (vielen Dank an alle!!!), sind meine derzeitigen Gedanken wie folgt.
Für mich selbst scheint es keinen großen Unterschied zwischen den beiden Ansätzen zu geben, und ich glaube, dass ich es so oder so gut hinbekommen würde.
Mit einem einzigen Store-Koordinator muss ich sicherstellen, dass neu erstellte Entitäten mit dem richtigen Store verbunden sind (keine große Sache). Mit mehreren Filialkoordinatoren muss ich sicherstellen, dass neu erstellte Entitäten dem richtigen Kontext hinzugefügt werden (wovon ich viele haben werde). Mit der Art und Weise, wie mein Code strukturiert ist, sollten beide Ansätze relativ einfach für mich sein.
Ich persönlich möchte jeweils nur in einem einzigen Geschäft suchen. Wenn ich mehrere Filialkoordinatoren habe, geht das automatisch. Wenn ich nur einen einzigen Filialkoordinator habe, muss ich sicherstellen, dass die Abrufanforderung eingeschränkt wird. (so oder so, keine große Sache).
In der Dokumentation zum Store Coordinator wird angedeutet, dass sein Vorteil darin besteht, dass er mehrere Läden als einen einzigen erscheinen lässt. Für meine Anwendung brauche oder will ich das nicht, also ist das für mich nicht wirklich eine Überlegung (obwohl, wenn ich in Zukunft storeübergreifende Suchfunktionen hinzufügen wollte, wäre es am besten, alles in einem einzigen Store Coordinator zu halten).
Für mich ist keiner der oben genannten Gründe ein wirklich gutes Argument, und wenn sie die einzigen Argumente wären, würde ich wahrscheinlich versuchen, die Dinge auf die konventionelle Art und Weise zu erledigen und bei einem einzigen Koordinator zu bleiben.
Ein letzter Grund (und der Hauptgrund, warum ich diese Frage ursprünglich gestellt habe) ist jedoch, dass ich plane, einige Funktionen in iOS 5 zu nutzen, die anscheinend mehrere Store Coordinators erfordern. Ich möchte in der Lage sein, weak-link meine App abwärtskompatibel zu sein, so scheint es, dass mit meinem iOS 4 Code eng ähneln die iOS 5 Code wäre vorzuziehen.
Je mehr ich darüber nachdenke, mit der Unterstützung für mehrere Betriebssystemversionen, könnte ich wahrscheinlich immer noch die Dinge so oder so mit den richtigen Abstraktionen implementieren.
Ich danke Ihnen allen für Ihr Feedback! Langsam bekomme ich den Dreh mit Core Data raus, was größtenteils eine großartige Erfahrung war, obwohl es mir auch Kopfschmerzen bereitet hat!