Core Data - Lightweight-Migrationen und mehrere Core-Datenmodelldateien (xcdatamodel)

Bei der Migration von einem Speicher, der durch zwei separate xcdatamodel-Dateien definiert ist, tritt ein Problem bei der Ausführung einer Lightweight-Migration auf.

In Version 1.0 meiner App wurden die Modelle in ein Analysemodell, Modell A, und alles andere in Modell B, aufgeteilt. Beim Kompilieren würden die Modelle zusammengefasst und alles reibungslos verlaufen.

Bei der Arbeit an der neuen Version 1.1 habe ich Modell B aktualisiert, indem ich Modell B eine neue Modellversion hinzugefügt und diese neue Version als aktiv festgelegt habe.

Das Problem tritt beim Upgrade von 1.0 auf 1.1 auf. Anscheinend überprüft Core Data den Modellspeicher auf der Festplatte (erstellt mit Version 1.0) und sucht nach dem Modell, das ihn beschreibt, kann jedoch kein EINZELNES Modell finden, das den gesamten Speicher definiert (Modell A deckt nur Analysen ab und Modell B deckt ab) alles andere), daher wird der Fehler "Modell für Quellspeicher kann nicht gefunden werden" ausgegeben.

Hat jemand eine Lösung für die Trennung von Modellen gefunden, die es dennoch ermöglicht, Upgrades und Lightweight-Migrationen ohne zusätzlichen Aufwand für die Definition benutzerdefinierter Migrationen durchzuführen?

Hier ist der Codeausschnitt, der zum Laden von Modellen verwendet wird:

    NSArray *modelNames = [NSArray arrayWithObjects:@"model-A", @"model-B", nil];
    NSMutableArray *models = [NSMutableArray array];
    for (NSString *name in modelNames)
    {
        LogInfo(@"loading model %@", name);
        NSURL *modelURL = [[NSBundle mainBundle] URLForResource:name withExtension:@"momd"];
        NSManagedObjectModel *model = [[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL] autorelease];
        [models addObject:model];
    }

    // combine all the separate models into one big one
    objectModel = [[NSManagedObjectModel modelByMergingModels:models] retain];

    NSURL *documentsDirectory = [NSURL fileURLWithPath:[SuperFileManager documentsDirectory] isDirectory:YES];
    NSURL *storeURL = [documentsDirectory URLByAppendingPathComponent:@"database.sqlite"];
    NSError *error = nil;

    coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:objectModel];
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                                                  [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                                                  [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                                                  nil];

    if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType
                                   configuration:nil
                                             URL:storeURL
                                         options:options
                                           error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

Antworten auf die Frage(4)

Ihre Antwort auf die Frage