NSManagedObject Entity Inheritance вызывает NSInternalInconsistencyException - PullRequest
2 голосов
/ 03 февраля 2012

У меня есть NSManagedObject ElementA с несколькими атрибутами, которые должны существовать в ElementB через отношения родитель-потомок.При установке ElementA в качестве родительского объекта для ElementB, NSPersistentStoreCoordinator завершается ошибкой.ManagedObjectModel правильно создается, и сущности / классы работают отдельно друг от друга.Единственная разница между сбоем приложения и компиляцией - это родительские и дочерние отношения.Ни один из атрибутов ни одной из сущностей не перекрывается.

У меня еще недостаточно представителей, поэтому изображения находятся по следующим ссылкам: Модель ElementA , Модель ElementB .

Что касается устранения неполадок, я пробовал все следующее:

  1. С использованием и без реализации пользовательских классов.
  2. Установка ElementA как абстрактного (однакоМне нужно, чтобы оно не было абстрактным)
  3. Удаление, а затем добавление атрибутов по одному (включая очистку всех атрибутов обоих объектов)
  4. Сброс Xcode (очистить), симулятор (сбросить)все) и перезапускаю мой компьютер.

Я прочитал документы Apple (Руководство по программированию базовых данных: модели управляемых объектов), и все, похоже, соответствует их рекомендациям по наследованию объектов.

Эта строка терпит неудачу:

__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

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

Редактировать для @ Rog's Comment

Приложение завершается ошибкой, как только при запуске запускается доступ к базовой модели данных.Новые изображения выше показывают, что я пытаюсь установить родительский объект ElementB с помощью редактора моделей.Вот сообщение об ошибке, которое я получаю:

uncaught exception 'NSInternalInconsistencyException', reason: 'Bad model.  For entity 'ElementA' subentity 'ElementB (0x785d790)' is not registered in NSManagedModelModel.  Model has a reference to ElementB (0x785e320)'

Ответы [ 2 ]

1 голос
/ 19 ноября 2013

Не полный код ... но именно так я добился того, о чем говорит @Scott BonAmi при удалении временных сущностей.Так как я все еще использую modelByMergingModels:, он сам определяет подсубъекты.

NSMutableArray *finalModels = [NSMutableArray arrayWithCapacity:0];
NSMutableArray *updatedEntities = [NSMutableArray arrayWithCapacity:0];

for (NSManagedObjectModel *immutableModel in allModels)  {
    NSManagedObjectModel *model = [immutableModel mutableCopy];

    for (NSEntityDescription *entity in [model entities]) {
        if ([[[entity userInfo] objectForKey:@"TempPlaceholder"] boolValue])  {
            // Ignore placeholder.
            DULog(@"Ignoring: %@", entity.name);
        } else {
            [updatedEntities addObject:entity];
        }
    }

    [model setEntities:updatedEntities];
    [updatedEntities removeAllObjects];
    [finalModels addObject:model];
}

NSManagedObjectModel *model = [NSManagedObjectModel modelByMergingModels:finalModels];
1 голос
/ 26 февраля 2012

Закончилось логической ошибкой с кодом, который я использовал из другого ответа SO , динамически создающего MOM.

При добавлении сущностей в массив во время цикла цикла ElementB (0x785d790) имеет виддобавляется в качестве элемента ElementA, а затем в цикле добавляется ElementB (0x785e320), вызывая тем самым разные области памяти и выбрасывая исключение NSInternalInconsistencyException.

...