Миграция из одной сущности в абстрактную родительскую сущность с дочерними сущностями, NSEntityMigrationPolicy не вызывается - PullRequest
1 голос
/ 04 марта 2011

Я пытаюсь обновить свое текущее приложение, чтобы использовать абстрактную родительскую сущность со специализированными подчиненными сущностями. Я создал пользовательский NSEntityMigrationPolicy, и в модели отображения я установил в пользовательской политике имя моего класса.

Я инициализирую свой постоянный магазин следующим образом, который должен быть довольно стандартным:

NSError *error=nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                     nil];

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
    NSLog(@"Error adding persistent store : %@",[error description]);
    NSAssert(error==nil,[error localizedDescription]);
}    

Когда я запускаю приложение, я получаю следующую ошибку:

Завершение приложения из-за отсутствия исключение 'NSInternalInconsistencyException', причина: «Операция не может быть завершено. (Ошибка какао 134140.) '

[error userInfo] содержит " reason = Не удается найти модель сопоставления для миграции "

Я проверил, что откроется версия 1 модели данных, и если я установил NSInferMappingModelAutomaticsOption, я получу миграцию, хотя мои сущности не переносятся правильно (как и ожидалось).

Я проверил, что модель сопоставления (cdm) находится в комплекте приложений, но почему-то отказывается ее найти. Я также установил точки останова и операторы NSLog () в настраиваемой политике миграции, и ни один из них не выполняется, с или без NSInferMappingModelAutomaticsOption

Есть какие-нибудь намеки на то, почему он не может найти модель картирования?

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

Во-первых, к абстрактным объектам прикреплен довольно большой штраф. Все дочерние элементы аннотации будут храниться в одной таблице. Это создаст очень широкую таблицу с большим количеством пустот. Я бы предложил пересмотреть вашу модель данных и убедиться, что вы действительно этого хотите.

Во-вторых, если вы не можете найти модель отображения, это означает, что она не совпадает ни с источником, ни с пунктом назначения. Если вы изменили пункт назначения после создания модели отображения, карта не будет найдена. Создание модели отображения должно быть последним шагом после завершения новой модели. Я бы даже порекомендовал заблокировать модель.

0 голосов
/ 10 марта 2011

Кажется, я решил вышеупомянутую проблему, хотя понятия не имею, что я сделал.

Пытаясь в течение 4 дней, чтобы заставить миграцию работать, я наконец сдался, поцарапал свой дизайн и начал заново,Где-то в процессе я сбросил основную ветку git на более раннюю ветку, чтобы проверить некоторые детали, и случайно запустил отладчик.К моему большому удивлению, теперь он выполнил миграцию просто отлично, и все работало.

Мое лучшее предположение, что у XCode было несколько старых миграций, которые он не смог удалить при очистке сборки (даже если я удалил вручнуюкаталог сборки)

...