我有一个NSManagedObject ElementA,它有几个属性,应该通过父子关系存在于ElementB中。将ElementA设置为ElementB的父实体时,NSPersistentStoreCoordinator失败。 ManagedObjectModel正在构建,并且实体/类彼此分开工作。应用程序失败和编译之间的唯一区别是这种父子关系。任何一个实体的属性都不重叠。
我还没有足够的代表,所以图片位于以下链接:ElementA Model,ElementB Model。
就故障排除而言,我已经尝试了以下所有方法:
我已经阅读了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)'
答案 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];