2015-07-23 3 views
11

Lange Rede kurzer Sinn, mein Kerndatenschema wurde geändert und meine App wurde an den App Store übermittelt, was dazu führte, dass alle, die ihre App aktualisiert haben, abstürzen. Der Absturz wird durch eine fehlende NSPersistentStore verursacht, da das Datenmodell nicht korrekt migriert wird.Ich habe NSPersistentStore in der neuen Version nicht migriert, kann ich mit einem App-Update wiederherstellen?

Ich sehe immer noch die .SQLite und zugehörige Datenbank-Dateien im Verzeichnis Dokumente, und wenn ich auf die ältere Version downgrade, funktioniert alles mit allen Daten. Meine Frage ist, kann ich das mit einem App-Update wiederherstellen, indem ich das vorhandene irgendwie migriere und es dem NSPersistentStoreCoordinator hinzufüge?

EDIT: also änderte ich eigentlich nicht mein xcdatamodel selbst, daher "lange Geschichte kurz". Allerdings habe ich XMPPFramework aus meinem Projekt entfernt und ich habe das Gefühl, dass dies das Kerndatenproblem verursacht haben könnte.

EDIT:
Ich habe keine Änderungen direkt an meinem Datenmodell vorgenommen, aber ich habe das Problem festgestellt. Ich habe meine NSManagedObjectModel unter Verwendung [NSManagedObjectModel mergedModelFromBundles:nil] abgerufen, die ALLE Datenmodelle zusammenführt, die im Bündel vorhanden sind. Dies beinhaltete alle Datenmodelle, die mit dem XMPPFramework ausgeliefert wurden, und jetzt, da das Framework entfernt wurde, ist das NSManagedObjectModel, das an [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel] übergeben wird, anders, was den Absturz verursacht.

Ich löste das Problem, indem FMDB verwendet, um den Inhalt der vorhandenen Datenbank abzurufen, erstellte dann eine neue SQLite-Datei und zeigte den persistenten Speicherkoordinator auf diese neue SQLite-Datei. Dann habe ich einfach alle vorhandenen Daten in die neue Datenbank eingefügt, indem ich die vorhandenen Daten durchlaufen und die entsprechenden s erstellt habe. Ich habe auch aufgehört, mergedModelFromBundles zu verwenden, um mein Datenmodell abzurufen, und stattdessen initWithContentsOfURL zu verwenden.

+0

Wenn Sie das Modell nicht geändert haben, was führt Sie zu dem Schluss, dass der Absturz durch nicht migrierte Daten verursacht wird? Die Migration ist nicht notwendig, es sei denn, das Modell hat sich geändert. –

+0

Der Fehler hat mit einem "fehlenden persistenten Speicher" in meinem NSManagedObjectModel zu tun. Dies ist immer (?) Aufgrund einer Änderung im Datenmodell. In meiner App befindet sich ein unordentlicher Code, der einige NSManagedObject-Eigenschaften im Code bearbeitet, sodass das gesamte Schema nicht im xcdatamodel definiert ist, was ebenfalls ein Problem verursachen kann. – quark

+0

Ich denke, das Problem ist, dass es schwer zu verstehen ist, was sich tatsächlich geändert hat. Sie scheinen zu sagen, dass sich das Modell geändert hat, aber auch, dass es sich nicht geändert hat. Was genau ist mit dem Modell passiert? –

Antwort

5

Eigentlich könnten Sie xcdatamodel irgendwie nach der ersten Version aktualisiert haben, und Sie haben kein neues xcdatamodel-Modell für die zweite Version erstellt. Also beim zweiten Update stürzt es ab.

HINWEIS: Nach der ersten Version müssen Sie eine zweite Modellversion von xcdatamodel erstellen.

Zum zweiten Modellversion xcdatamodel erstellen -
1. zuerst müssen Sie Model.xcdatamodeld wählen -> Gehen Sie auf Menü-Editor -> Add Modell Version. Hier müssen Sie eine Modellversion angeben und basierend darauf, welches alte Modell Sie erstellen möchten.
Nun, was auch immer Sie ändern wollen, sollten Sie an der neuen Modellversion xcdatamodel vornehmen.

enter image description here

2. Sie auf dem Bild sehen kann, habe ich einen neuen Namen zu meinem neuen Modell ‚Model2.0‘ gegeben, die auf meinem vorherigen ‚Model‘ basieren.
Neues Modell funktioniert genau wie Ihr altes Modell, Änderungen am neuen Modell werden sich nicht auf Ihr altes Modell auswirken. Es wird also Ihre App nach dem Update nicht zum Absturz bringen.
3. Sie müssen Ihr neues 'Model2.0' als Standardarbeitsmodell auswählen. Bitte beachten Sie hierzu das Bild unten.

enter image description here

4. Hier können Sie sehen, 2-Modell gibt es jetzt. Bitte wählen Sie 'Modell.xcdatamodeld 'ein Hauptmodell, und öffnen Sie es' File Inspector 'auf der rechten Seite - wie oben auf dem Bild geöffnet.

5. Auf der rechten Seite befindet sich das Feld "Model Version", das das für dieses Projekt ausgewählte "aktuelle" Modell angibt. Bitte wählen Sie das neue Modell 'Model2.0' für Ihre aktualisierte Version. Jetzt können Sie laufen und es wird gut weitergehen.

HINWEIS: Bitte stellen Sie sicher, was auch immer Sie ändern werden, Sie werden es auf Ihrem neuen Modell 'Model2.0' tun, so wird es nicht mit Ihrem alten Modell kollidieren. Sie müssen jedes Mal ein neues Modell erstellen, wenn Sie die Konfiguration von xcdatamodel in der aktualisierten App-Version ändern möchten.

+0

Ich habe Änderungen in der alten Version gemacht, aber jetzt verworfen. Ich habe immer noch denselben Fehler. irgendeine Hilfe? –

Verwandte Themen