2010-11-29 9 views
5

Ich habe Core Data-Anwendung und ich migrierte (Upgrade) das Kerndatenmodell. Jedes Mal, wenn ich eine neue Version erstelle, erstelle ich für jede Version ein Mapping-Modell. Im Moment habe ich 16 Versionen und ich habe Mapping-Modelle, die so gehen: 1to2.xcmappingmodel 2to3.xcmappingmodel 3to4.xcmappingmodel ... etc. bis 16Durch verschiedene Versionen in Kerndaten migrieren

Das funktioniert gut, aber ein Problem entsteht, wenn ein Benutzer eine Datendatei mit Version 10 hat und die Anwendung mit Version 16 aktualisiert. Einige, wie ich dachte, Core-Daten wird automatisch von 10 auf 16 aktualisiert Es erscheint ein Fehler mit der Meldung "Missing Mapping Model". Um sicherzustellen, dass die Mapping-Modelle korrekt sind, aktualisiere ich sie einzeln auf jede Version (10 bis 11, 11 bis 12 usw.) und es hat funktioniert ... Hier ist mein Code.

ich geben Sie die Modellversion mit diesem Code:

NSBundle *modelWrapper = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"TaskApp_DataModel" ofType:@"momd"]]; 
NSString *modelPath = [modelWrapper pathForResource:@"TaskApp_DataModel 16" ofType:@"mom"]; 
NSLog(@"%@",modelPath); 
managedObjectModel = [[NSManagedObjectModel alloc]initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]]; 

Und ich definieren die Migrate Option Automatisch hier:

NSURL *url = [NSURL fileURLWithPath: [applicationSupportDirectory stringByAppendingPathComponent: @"storedata-sql"]]; 


NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
[dict setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption]; 



if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
              configuration:nil 
              URL:url 
              options:dict 
              error:&error]){ 

Wer weiß, wie dies zu aktualisieren? Danke.

Antwort

1

es wird nur versucht, von der vorhandenen Benutzerversion (möglicherweise v1) auf die aktuelle Version zu wechseln. Wenn Sie 3 Versionen haben, benötigen Sie Karten für v1-v2, v2-v3, v1-v3. Haben Sie alle 16 Versionen ausgeliefert? Wenn dies der Fall ist, müssen Sie möglicherweise neue Migrationsmaps erstellen. Es kann sich auch lohnen, die automatische Migration zu aktivieren, wenn Sie sie zuvor noch nicht ausprobiert haben, da sie die Lücken sehr gut füllen kann. Ich denke, es ist:

[dict setObject:[NSNumber numberWithBool:YES] forKey:NSInfersMappingModel];

aber Sie werden, dass verdoppeln müssen überprüfen.

Entschuldigung der Bringer von schlechten Nachrichten sein

+1

Ja danke ... Ich finde es nur in Marcus Zarra Core Data Buch ... schrieb er eine große Prozedur von jedem Modell zum nächsten zu migrieren, ohne zusätzlichen schreiben Mapping-Modelle. Gehen Sie auf NSINfersMappingModel zu überprüfen Danke! –

+0

InfersMappingModel hat funktioniert !!! Vielen Dank! –

+0

versuchen Sie, Datenmigrationen auf ein Minimum zu beschränken (dh Hauptversionen), da der Overhead sehr schnell baloons (Mapping Modelle von jeder Version auf die aktuelle für jede Änderung). Beachten Sie auch, dass die automatische Migration von einer Version zur nächsten funktionieren kann , aber Ihr Modell kann genug ändern, dass von Version 16 zu 21 so unterschiedlich ist, dass es den Unterschied nicht berechnen kann. Schön, dass du es sortiert hast! – MCannon

Verwandte Themen