【问题标题】:NSManagedObject Entity Inheritance causes NSInternalInconsistencyExceptionNSManagedObject 实体继承导致 NSInternalInconsistencyException
【发布时间】:2012-02-03 05:05:48
【问题描述】:

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

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

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

  1. 实现和不实现自定义类。
  2. 将 ElementA 设置为抽象(但我需要它不是抽象的)
  3. 一次删除然后添加一个属性(包括清空两个实体的所有属性)
  4. 重置 Xcode(清理)、模拟器(全部重置)并重新启动我的机器。

我阅读了 Apple 的文档(核心数据编程指南:托管对象模型),一切似乎都符合他们的实体继承指南。

这是失败的那一行:

__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)'

【问题讨论】:

  • 您需要提供更多详细信息。发布您的托管对象模型视图的屏幕截图。此外,它何时崩溃 - 在启动期间,在实例化托管对象之一时。您如何将 ElementA 设置为 ElementB 的父/超类?您遇到什么错误?

标签: objective-c core-data nsmanagedobject


【解决方案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];

【讨论】:

    【解决方案2】:

    我使用another SO answer 动态创建 MOM 的代码最终出现逻辑错误。

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

    【讨论】:

    • 您是否有更多关于解决此问题的详细信息。我现在面临同样的问题,并且即将实施解决方案。
    • @bandejapaisa:当我回到一台上面有代码的机器上时,我会发布对此答案的编辑。
    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2010-10-07
    相关资源
    最近更新 更多