【发布时间】:2011-12-15 12:50:41
【问题描述】:
我对核心数据有疑问。 我有一个带有多个标签的应用程序。每个选项卡都包含一个不同“对象”的列表。 在每个选项卡中,我都有一个添加按钮 (+),可将我带到可以添加“对象”的屏幕。
问题:
当我单击添加实体以进行插入时,正在创建并添加到上下文中。
所以,我进入第一个选项卡,单击添加 - 一个实体在上下文中。 我在其他选项卡上,单击添加 - 另一个实体在上下文中。
我完成为其中之一添加信息(有效)并点击保存。 现在核心数据抛出一个异常,说无法保存上下文,因为其他实体无效。
我想到的一个想法是:
从上下文中复制所有无效的对象,保存上下文,将复制的对象添加回来(在需要时等等)。
但是一个实体可能与其他实体有其他关系,因此 Person 可以有地址、角色、联系方式……而 Company 可以有 Address、Employes ……等等。 如果 person 无效并且关系 Address valid ,上述想法失败,因为不会保存 person 但会保存 address ,这是不正确的。
具有临时上下文的东西可以工作,但我不清楚如何实现这一点。
另一个想法是在我想保存实体(例如人)时获取它的所有关系,并且只保存人。 但是我没有实现递归函数(问题在于关系是反向的,因为我的核心数据模型上有很多关系(人有联系方式,也有公司)。
代码如下:
- (void)relationshipInstancesForManagedObject:(NSManagedObject *)managedObject andSkipValue:(id)skipValue andSet:(NSMutableSet *)set { for (NSRelationshipDescription *relationship in managedObject.entity.properties) { if (![relationship isKindOfClass:[NSRelationshipDescription class]]) 继续; id value = [managedObject valueForKey:relationship.name]; if (value == skipValue || value == nil || value == self || [set containsObject:value] ) 继续; NSLog(@"%@",value); 如果(relationship.isToMany) { if ([value containsObject:skipValue] || [value containsObject:managedObject] || [value count] == 0) { 继续; } for (NSManagedObject *实体值) { [设置添加对象:实体]; [自我关系InstancesForManagedObject:实体 和SkipValue:skipValue 和设置:设置]; } } 别的 { 如果(值!= nil){ [设置添加对象:值]; [自我关系InstancesForManagedObject:值 和SkipValue:skipValue 和设置:设置]; } } } }如果您有任何想法,我将不胜感激。
【问题讨论】:
-
尽量不要将实体与对象混淆。与类一样,实体描述了特定类型的托管对象——给定实体的所有对象都将具有相同的属性集。
标签: iphone objective-c core-data