Сбой миграции iPhone CoreData с «Не могу найти модель для исходного магазина» - PullRequest
8 голосов
/ 25 сентября 2010

У меня есть приложение для iPhone, которое использует CoreData. Недавно я внес небольшие изменения в модель данных, и теперь каждый раз, когда приложение открывается, я получаю сообщение об ошибке «Не удается найти модель для хранилища исходного кода».

У меня есть 2 версии модели данных, и единственными изменениями, которые я сделал, были некоторые дополнения некоторых полей. Я следовал руководству здесь , которое работало изначально, а затем только сегодня, после добавления некоторых дополнительных полей, оно ломается. Все дополнительные поля помечены как дополнительные и имеют значения по умолчанию. Код миграции указан ниже:

NSURL *storeUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"xxx.sqlite"]];

// migration options
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]) {
...
}

Управляемая модель объекта успешно создана здесь:

- (NSManagedObjectModel *)managedObjectModel {

if (managedObjectModel != nil) {
    return managedObjectModel;
}

NSString *path = [[NSBundle mainBundle] pathForResource:@"DataModelName" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

return managedObjectModel;
}

Я отследил проблему до несоответствия в версии для 1 объекта. Возникающая ошибка включает в себя следующее:

MyEntityName = <cc1456b7 b12d0d05 21930308 94ccc078 27a6c345 8847c738 e3a9ae7e 0be9535d>;

но хеш в VersionInfo.plist в комплекте приложений:

MyEntityName = <fede6b59 462442d1 8fc98226 b9f8f745 3250dabd ee188248 cb97b1d0 8a74eef3>;

В списке VersionInfo.plist нет других сущностей с хешем <cc1456b7....>.

Ответы [ 2 ]

5 голосов
/ 25 сентября 2010

Из связанного ответа:

Это выглядит великолепно и так просто, как я и хотел - но я думаю, что вам нужно быть осторожным во время разработки, когда вы меняете модель - в противном случае вам придется создатьновая версия для каждого изменения.

Похоже, вы сделали версию 2, отредактировали версию 2, запустили приложение, снова отредактировали версию 2 и снова запустили приложение.Это не так хорошо работает;вам нужно сохранить все версии моделей, которые вы ожидаете открыть.Это немного хлопотно.

Что вы можете сделать, это назвать все свои модели в соответствии с версиями приложения, например, FooModel-1 и FooModel-1.1, соответствующие релизам, и FooModel-1.2d1, FooModel-1.2d2 для«разрабатываемые» версии.Перед выпуском вы можете переименовать FooModel-1.2d10 в FooModel-1.2 и удалить другие версии для разработки.

(Или я мог полностью неправильно прочитать вопрос; извините.)

0 голосов
/ 30 июля 2014

Ну, в моем случае происходило точно то же самое, и я работал на iOS 7, и эта проблема поразила мою голову, по крайней мере, неделю, а затем, наконец, нашел решение, которое работает для меня.Чтобы заставить это работать, вы должны добавить дополнительное значение в опциях, которое используется для добавления PersistentStore, и затем вы идете (я не уверен насчет другой версии iOS, но да, она определенно будет работать на iOS 7).

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

-(NSPersistentStoreCoordinator *)persistentStoreCoordinator
 {

   if (persistentStoreCoordinator != nil)
   {
       return persistentStoreCoordinator;
   }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ABC.sqlite"];

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] ini   tWithManagedObjectModel:[self managedObjectModel]];

//Creating Lightweight migration.
    NSDictionary *options =
    @{
      NSMigratePersistentStoresAutomaticallyOption:@YES
      ,NSInferMappingModelAutomaticallyOption:@YES
      ,NSSQLitePragmasOption: @{@"journal_mode": @"DELETE"}
     };


   if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
       abort();
    }
return persistentStoreCoordinator;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...