Миграцията на основни данни не може да обедини модели с два различни обекта с име „foo“

Знам, че това е често задаван въпрос, но нито едно от решенията, които открих, изглежда не работи за мен.

Това е моята ситуация: имам един модел на данни за моето приложение и исках да добавя версия към него. Така че в XCode направих Design -> Data Model -> Add Model Version. Също така актуализирах метода persistentStoreCoordinator на моя делегат, за да изглежда така:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }
    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
                                               stringByAppendingPathComponent: @"foo.sqlite"]];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                             nil];
    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        /*Error for store creation should be handled in here*/
    }

    return persistentStoreCoordinator;
}

Само за да се уверя, че всичко все още работи, направих чисто всичко, изградих и го тествах в симулатора. Всичко работеше досега.

След това избрах модела на данните за новата версия, зададох го да бъде текущата версия с помощта на XCode и добавих един допълнителен атрибут към обект. След това направих чисто всичко, изграждане. И сега, когато стартирам приложението, то се срива с тази грешка: „Не мога да обединя модели с два различни обекта с име „foo“.

какво правя грешно Опитах се да се уверя, че към целта не е добавен модел на данни, като добавих само текущата версия на модела на данни към целта, и двете. Всеки път, когато тествам, се уверявам, че почиствам всички.

Може ли някой да хвърли малко светлина защо не работи за мен?

РЕДАКТИРАНЕ:

ето моят метод managedObjectModel:

- (NSManagedObjectModel *)managedObjectModel {
  if (managedObjectModel != nil) {
    return managedObjectModel;
  }
  managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];

  return managedObjectModel;
}

person nan    schedule 22.09.2010    source източник
comment
моля, добавете вашия метод -(NSManagedObjectModel*) managedObjectModel. Подозирам, че проблемът е там.   -  person Martin Brugger    schedule 23.09.2010


Отговори (2)


Вече очаквах тази реализация на инструмента за получаване на managedObjectModel.

Във вашата реализация всички модели в пакета са обединени в един единствен модел. Следователно всички версии в рамките на .momd се обединяват, което води до дублиращи се дефиниции на обекти.

Променете кода, за да инициализирате изрично модела с подходящия моделен файл и той трябва да работи добре.

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"datamodel" ofType:@"momd"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    
person Martin Brugger    schedule 23.09.2010
comment
Правейки това, получавам различна грешка: Този NSPersistentStoreCoordinator няма постоянни магазини. Не може да извърши операция за запазване. - person nan; 24.09.2010
comment
Регистрирайте modelPath, за да видите дали наистина сте заредили валиден управляван обектен модел. - person Martin Brugger; 24.09.2010
comment
В крайна сметка не използвах опцията за автоматично извеждане на модела на картографиране и дефинирах свой собствен. Сега всичко работи според очакванията. Благодаря. Регистрирах грешката за NSPersistentStoreCoordinator и тя казва, че не може да бъде изведен модел на картографиране. - person nan; 24.09.2010

Ако използвате Version Models за Основни данни, винаги трябва да инициализирате към версията на модела, който искате да използвате. На Application Bundle ще намерите един файл с разширение .momd, който е пълният модел. Вътре в този файл ще намерите много .mom файлове вътре, всеки .mom файл представлява една версия на вашия модел.

Ако стартирате приложението си и инициализирате с .momd файла и всички версии вътре, Core Data ще създаде всички версии и по-късно ще имаме грешката "дублиран обект", Core Данните не са известни каква версия използват. Сега единственият начин да коригирате проблема е да изтриете приложението, да насочите кода си към правилния файл .mom и да стартирате отново, така че Core Data да създаде само една версия на вътрешната база данни.

Ето един кодов фрагмент, който върши работата:

NSString *fullModelName    = @"myModel.momd";    // The name of the main model.
NSString *modelVersionName = @"myModel1.0.mom";  // Only the name of the version.
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
NSString *modelPath = [NSString stringWithFormat:@"%@/%@/%@", bundlePath, fullModelName,  modelVersionName];
//
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 
person SEQOY Development Team    schedule 11.08.2011
comment
NSString *modelPath = [NSString stringWithFormat:@%@/Contents/Resources/%@/%@, bundlePath, fullModelName, modelVersionName]; - person user8675; 31.05.2014