2017-02-14 2 views
1

Ich habe eine Core Data Database in meiner App, die UIManagedDocument verwendet, und eine neue Version oben auf eine alte hinzugefügt.Core-Daten beim Hinzufügen eines neuen Attributs der bestehenden Entität in einer neuen Version

enter image description here

Die neue Version funktioniert kein Problem, wenn ich neue Entity mich hinzufügen, ohne alten Entity zu verändern. Aber sobald ich ein neues Attribut zu einer bestehenden Entität der alten Version hinzugefügt habe. UIManagedDocument ist an dem Punkt abgestürzt, an dem initWithFileURL aufgerufen wurde. So habe ich das UIManagedDocument erstellt.

UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:databaseURL]; 
self.databaseDocument = document; 


NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 
self.databaseDocument.persistentStoreOptions = options; 

Scheint, wie es bei modelByMergingModels abgestürzt genannt, während initWithFileURL enter image description here

Ich weiß, das die Codezeile ist, die aufgrund der Ausnahmeunterbrechungs abgestürzt. enter image description here

Wenn ich das neu hinzugefügte Attribut löschen, erstellen Sie das NSManagedObject erneut. Der Code läuft kein Problem mehr.

Hinweise, warum scheitert es? Jede Idee wird geschätzt.

+1

Haben Sie eine neue Version der Modelldatei erstellt oder bearbeiten Sie die Modelldatei an Ort und Stelle? –

+0

@TomHarrington Ich habe eine neue Version von Model hinzugefügt. Bitte sehen Sie einen anderen Screenshot, den ich hochgeladen habe. – John

Antwort

0

Akzeptierte Antwort von dieser Frage löste das Problem. UIManagedDocument migrate data model

- (NSManagedObjectModel *)managedObjectModel{ 
     NSString *path = [[NSBundle mainBundle] pathForResource:@"Model" ofType:@"momd"]; 
     NSURL *momURL = [NSURL fileURLWithPath:path]; 
     NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; 

     return managedObjectModel; 
} 

Ich weiß nicht wirklich, warum es über den Dateinamen des NSManagedObjectModel gesagt werden muss. Aber Blick in den Stapel an der Stelle, an der es abgestürzt ist: enter image description here Es stürzte wirklich beim Aufruf von UIManagedDocument initWithFileURL Aufruf von managedObjectModel. Und tiefer im Stapel scheint es zu versuchen, alle Modelle, die im Bundle existieren, zusammenzuführen. Vielleicht, denke ich, dass die zwei Versionen der Modelle als zwei Modelle behandelt werden, um sie als eine, anstatt zwei Versionen zu vereinen - dadurch erscheinen die zwei Versionen als zwei separate Dateien im Bundle. Beim Versuch zu verschmelzen, verursacht die Existenz von zwei Tabellen mit demselben Namen, aber verschiedenen Attributen, Konflikte, deshalb ist es abgestürzt.

0

Es stürzt ab, weil, wenn es versucht, das Dokument zu erstellen, die Optionen noch nicht festgelegt wurden. Erstellen Sie das Dokument mit nur init, setzen Sie seine persistentStoreOptions und rufen Sie dann configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error:

+0

Hallo Jon, danke für die Idee. Guter Versuch und es macht Sinn. UIManagedDocument kann jedoch nicht einfach mit init erstellt werden. Es stellt sich heraus, dass es mit *** Assertionsfehler in - [UIManagedDocument init], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.60.12/UIDocument.m:296 – John

+0

Ja, Du hast recht. Ich lese die 'UIManagedDocument'-Dokumentation erneut und jetzt verstehe ich, dass die Klasse für Unterklassen ausgelegt ist. Versuchen Sie, eine Unterklasse von "UIManagedDocument" zu erstellen und "persistentStoreOptions" zu implementieren, um die gewünschten Migrationsoptionen zurückzugeben. –

+0

Immer noch Absturz beim Überschreiben von persistentOptions. Das Überschreiben von managedObjectModel hat es jedoch zum Laufen gebracht! Obwohl ich nicht verstehe warum, funktioniert es! – John

Verwandte Themen