我对核心数据有疑问。 我有一个带有多个标签的应用。每个选项卡都包含一系列不同的"对象"。 在每个选项卡中,我有一个添加按钮(+),可以将我带到一个屏幕,我可以在其中添加一个"对象"。
问题:
当我单击添加时,正在创建插入实体并将其添加到上下文中。
所以,我继续第一个标签,点击添加 - 实体在上下文中。 我转到其他选项卡,我点击添加 - 另一个实体在上下文中。
我完成为其中一个添加信息(有效)并点击保存。 现在核心数据抛出一个异常,说无法保存上下文,因为另一个实体无效。
我想到的一个想法是:
从上下文中复制所有无效的对象,保存上下文,添加复制的对象(等等)。
但是一个实体可以与其他实体建立其他关系,因此人可以拥有地址,角色,联系方式......公司可以拥有地址,雇员等。 如果人无效且关系地址有效,则上述提示失败,因为不会保存人员但会保存地址,这是不正确的。
具有临时背景的东西可以起作用,但我不清楚如何实现这一点。
另一个想法是当我想保存它时,为实体(例如Person)获取所有关系,并且只保存Person。 但我没有实现一个递归函数(问题在于关系是反向的,因为我的coredata模型上存在很多关系(人有联系方式,也有公司))。
以下是代码:
- (void)relationshipInstancesForManagedObject:(NSManagedObject *)managedObject andSkipValue:(id)skipValue andSet:(NSMutableSet *)set { for (NSRelationshipDescription *relationship in managedObject.entity.properties) { if (![relationship isKindOfClass:[NSRelationshipDescription class]]) continue; id value = [managedObject valueForKey:relationship.name]; if (value == skipValue || value == nil || value == self || [set containsObject:value] ) continue; NSLog(@"%@",value); if (relationship.isToMany) { if ([value containsObject:skipValue] || [value containsObject:managedObject] || [value count] == 0 ) { continue; } for (NSManagedObject *entity in value) { [set addObject:entity]; [self relationshipInstancesForManagedObject:entity andSkipValue:skipValue andSet:set]; } } else { if (value != nil) { [set addObject:value]; [self relationshipInstancesForManagedObject:value andSkipValue:skipValue andSet:set]; } } } }
如果您有任何想法,我将不胜感激。
答案 0 :(得分:1)
解决问题的最简单方法是确保将所有对象添加到商店时所有对象都有效。首先收集创建有效对象所需的信息,然后添加新对象以及所有必需信息。
另外,请仔细考虑是否需要要求您当前所有的所有属性。如果您有两个实体,每个实体都与另一个实体有关系,您是否需要同时需要两种关系?你能让其中一个关系成为可选的吗?这可以帮助你避免鸡和蛋的问题,因为不可能为任何一个实体添加对象,因为还没有其他类型存在。