我有关于核心数据的问题。 我有一个应用程序与多个选项卡。每个选项卡都包含不同“对象”的列表。 在每个标签中,我有一个添加按钮(+),可以将我带到一个可以添加“对象”的屏幕。核心数据多个实体
问题:
当我点击添加实体插入被创建并添加到上下文。
所以,我去第一个选项卡上,单击添加 - 一个实体是在上下文中。 我在其他选项卡上,我点击添加 - 另一个实体是在上下文中。
我完成添加其中一个信息(有效)并点击保存。 现在核心数据会抛出一个异常,说无法保存上下文,因为其他实体无效。那我脑子里浮现
一个想法是:
复制是从上下文中无效的所有对象,保存上下文,添加复制者背部(等需要的时候)。
但是一个实体可能与其他实体有其他关系,所以人们可以拥有地址,角色,联系方式..以及公司可以有地址,雇用..等 如果人无效并且有关系地址有效,失败是因为不会保存人,但会保存地址,这是不正确的。
临时上下文可以工作,但我没有清楚的想法如何实现这一点。
另一个想法是,当我想保存它时,为一个实体(例如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]; } } } }
如果你有任何想法,我将不胜感激。
尽量不要将实体与对象混淆。像一个类一样,一个实体描述了一个特定类型的被管理对象 - 一个给定实体的所有对象都具有相同的一组属性。 – Caleb 2011-12-24 15:02:52