Ich habe eine App entwickelt, iCollege , und jetzt möchte ich die App machen viel besser.
Während des Testens wollte ich die Daten von einem Backup wiederherstellen. Beim Start von iCollege stürzt die App ab, weil sie nicht von Core Data versioniert werden konnte. Meine Frage ist nun, ob es möglich ist, eine Core Data-Datei manuell zu versionieren, d. H. Jedes Managed Object der existierenden Datei zu durchlaufen und die Objekte an die aktive Model Version anzupassen.
Ist so etwas möglich?
BEARBEITEN: Vielen Dank für Ihre schnelle und detaillierte Antwort. Ich denke, dass ich meine Frage nicht sehr gut erklärt habe. Hier ist eine weitere Beschreibung meines Problems.
Ich habe eine Datei mit Core Data mit einigen Objekten der Entitäten Course
und Teacher
erstellt. Ich ersetze die Core Data-Datei meiner App durch diese Datei. Wenn die App das nächste Mal startet, möchte ich eine Methode aufrufen, die die verwalteten Objekte der Datei mit den Objekten Course
und Teacher
liest und sie in die Entitäten konvertiert, z. Subject
und Professor
. Die Attribute können auch geändert werden. Meine Frage ist, ob ich das kann, d. H. Kann ich die Core Data-Datei selbst versionieren?
Ich hoffe meine Frage ist jetzt überprüfbar. : -)
Sie können dies folgendermaßen tun. Core-Daten ermöglichen das Hinzufügen mehrerer persistenter Stores zu einem NSPersistentStoreCoordinator
. Sie benötigen also zwei Stores, die Ihrem Coordinator zugeordnet sind. Beachten Sie, dass es nicht möglich ist, zwei verschiedene Managed Object Models (MOMs) zu verwenden. Sie können nur eine MOM für alle Ihre Stores verwenden.
Dies mag zwar etwas schwierig erscheinen, ist jedoch einfach genug, da Core Data auch die Verwendung von Konfigurationen zulässt. Eine Konfiguration hat einen Namen und eine zugehörige Gruppe von Entitäten. Die Sätze können sich überlappen, dh ein bestimmtes Element kann in mehr als einer Konfiguration angezeigt werden. Weitere Informationen finden Sie in der zugehörigen Dokumentation
Sie können jetzt leicht mit Ihrem Problem umgehen, indem Sie verschiedene Entitäten in verschiedenen Läden haben, Erstellen Sie ein Modell, das eine Obermenge aller Entitäten sein wird, die Sie gehen mit (oder zumindest der Vereinigung) umzugehen und das definiert die Teilmengen, die Sie als Konfigurationen benötigen. Dann geben Sie für jeden einzelnen Speicher die zugehörige Konfiguration an.
Etwas wie (nur ein Beispielschnipsel):
%Vor% Obwohl Sie Ihre Daten theoretisch manuell migrieren können, ist es wahrscheinlich nicht die Mühe wert. Sie möchten automatic lightweight migration
verwenden.
Um eine automatische Lightweight-Migration durchzuführen, müssen Sie zwei Datenmodelle einrichten. Anschließend teilen Sie Core Data im Code mit, dass die Migration durchgeführt werden soll. Dies bedeutet, dass Sie Ihr Datenmodell erst ändern sollten, wenn Sie das Lesen dieses abgeschlossen haben. Wenn Sie Ihr altes Modell (automatisch oder manuell) wiederhergestellt haben. Sie benötigen es, um die Migration durchzuführen. So funktioniert die automatische Lightweight-Migration:
Zuerst müssen Sie Ihrem Datenmodell eine Modellversion hinzufügen. Wählen Sie das vorhandene Modell aus und fügen Sie dann eine Version aus dem Menü Editor
hinzu:
Sie werden aufgefordert, Ihr Datenmodell zu benennen und auszuwählen, welches vorhandene Modell als Grundlage dienen soll.
Gehen Sie nun vor und nehmen Sie die Änderungen am neuen Modell vor. Wenn Sie fertig sind, müssen Sie Core Data mitteilen, dass dieses neue Modell als aktuelle Version verwendet werden soll. Wir sind noch nicht am Code, also ist dieser Teil einfach. (Der Code ist auch einfach.) Wählen Sie auf der rechten Seite das aktive Modell, wie hier gezeigt:
Vergewissern Sie sich, dass Ihr Modell im linken Navigator ausgewählt ist, da sonst die Optionen auf der rechten Seite nicht angezeigt werden. Sie sollten mit so etwas enden:
(Ich verwende hier Version 2 statt Version 3, aber die Idee ist die gleiche.)
Nun müssen Sie Ihren Code schnell ändern, damit Core Data die Migration für Sie erledigt.
Ändern Sie diese Zeile in Ihrer persistentStoreCoordinator
-Methode in Ihrem App-Delegaten:
zum folgenden (Hinzufügen in der Zeile vor der if
-Anweisung):
Sie haben Core Data im Wesentlichen an ein Wörterbuch mit Optionen übergeben, in dem der Datenspeicher für Sie migriert wird. (Schauen Sie sich den vorhergehenden Code genau an, er wird nach ein paar Durchläufen Sinn ergeben.)
Bearbeiten: Sie können wahrscheinlich tun, was Sie wollen. Wenn ich Sie richtig verstehe, sollten Sie eine neue Modellversion erstellen, eine leichte Migration durchführen und die gewünschten Änderungen manuell vornehmen. Meine obige Antwort steht immer noch, außer dass Sie danach einige manuelle Änderungen vornehmen wollen.
Tags und Links iphone ios xcode core-data versioning