2012-02-03 62 views
2

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

我还没有足够的代表,所以图片是在以下链接:ElementA Model,ElementB Model

至于故障排除去,我已经试过所有的以下内容:

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

我已经阅读了Apple的Docs(核心数据编程指南:管理对象模型),并且所有内容似乎都与他们的实体继承指南一致。

这是一个失败行:

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

我似乎什么在这里失踪?这很明显,因为这看起来不应该这么难。任何和所有的帮助表示赞赏!

编辑为@罗格的评论

应用程序只要核心数据模型首次启动时访问失败。上面的新图像显示我正在尝试使用模型编辑器设置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)' 
+0

您需要提供更多详细信息。发布您的托管对象模型视图的屏幕截图。此外,它何时崩溃 - 在启动时,实例化其中一个管理对象时。你如何将ElementA设置为ElementB的父类/超类?你得到的错误是什么? – Rog 2012-02-03 06:12:00

回答

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]; 
1

结束了与I从another SO answer用于动态创建MOM代码中的逻辑错误。

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

+0

您是否有任何有关此解决方法的更多详细信息。我现在面临同样的问题,并即将实施解决方案。 – bandejapaisa 2013-11-19 10:56:37

+0

@bandejapaisa:当我回到一台有代码的机器上时,我会发布一个编辑来解答这个问题。 – sbonami 2013-11-19 16:49:53

+0

谢谢 - 我明白了。我会在下面发布我的解决方案。 – bandejapaisa 2013-11-19 17:03:13