NSManagedObject实体继承导致NSInternalInconsistencyException

时间:2012-02-03 05:05:48

标签: objective-c core-data nsmanagedobject

我有一个NSManagedObject ElementA,它有几个属性,应该通过父子关系存在于ElementB中。将ElementA设置为ElementB的父实体时,NSPersistentStoreCoordinator失败。 ManagedObjectModel正在构建,并且实体/类彼此分开工作。应用程序失败和编译之间的唯一区别是这种父子关系。任何一个实体的属性都不重叠。

我还没有足够的代表,所以图片位于以下链接:ElementA ModelElementB Model

就故障排除而言,我已经尝试了以下所有方法:

  1. 使用和不使用自定义类。
  2. 将ElementA设置为抽象(但我需要它不是抽象的)
  3. 一次删除一个属性然后添加一个属性(包括清空两个实体的所有属性)
  4. 重置Xcode(清洁),模拟器(全部重置),然后重新启动我的机器。
  5. 我已经阅读了Apple的Docs(核心数据编程指南:托管对象模型),所有内容似乎与他们的实体继承指南一致。

    这是失败的行:

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

    我在这里似乎缺少什么?它必须是显而易见的,因为这似乎不应该是这么难。任何和所有的帮助表示赞赏!

    编辑@ Rog的评论

    在启动时第一次访问核心数据模型时,应用程序会失败。上面的新图像显示我正在尝试使用模型编辑器设置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 个答案:

答案 0 :(得分:1)

使用another SO answer动态创建MOM的代码结束了逻辑错误。

在循环序列期间向数组添加实体时,ElementB(0x785d790)被添加为ElementA的子实体,然后在循环'ElementB(0x785e320)'中添加,从而导致不同的内存位置并抛出NSInternalInconsistencyException

答案 1 :(得分:1)

不是完整的代码......但这是我实现@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];