Iphone 多实体核心数据

Iphone 多实体核心数据,iphone,objective-c,core-data,Iphone,Objective C,Core Data,我有一个关于核心数据的问题。 我有一个有多个标签的应用程序。每个选项卡都包含不同“对象”的列表。 在每个选项卡中,我都有一个添加按钮(+),可以将我带到一个屏幕,在那里我可以添加一个“对象” 问题是: 单击“添加用于插入的实体”时,将创建一个实体并将其添加到上下文中 所以,我进入第一个选项卡,单击添加-一个实体在上下文中。 在“其他”选项卡上,单击“添加”-上下文中有另一个实体 我为其中一个添加完信息(要有效),然后点击save。 现在核心数据抛出一个异常,表示无法保存上下文,因为另一个实体认为

我有一个关于核心数据的问题。 我有一个有多个标签的应用程序。每个选项卡都包含不同“对象”的列表。 在每个选项卡中,我都有一个添加按钮(+),可以将我带到一个屏幕,在那里我可以添加一个“对象”

问题是:

单击“添加用于插入的实体”时,将创建一个实体并将其添加到上下文中

所以,我进入第一个选项卡,单击添加-一个实体在上下文中。 在“其他”选项卡上,单击“添加”-上下文中有另一个实体

我为其中一个添加完信息(要有效),然后点击save。 现在核心数据抛出一个异常,表示无法保存上下文,因为另一个实体认为它无效

我想到的一个想法是:

从上下文复制所有无效的对象,保存上下文,将复制的对象添加回上下文(需要时依此类推)

但一个实体可以与其他实体有其他关系,这样此人就可以有地址、角色和联系方式。。公司可能有地址,雇员。。等 若此人无效且关系地址有效,则上述想法将失败,因为它不会保存此人,但会保存地址,这是不正确的

具有临时上下文的东西可以工作,但我不清楚如何实现它

另一个想法是,当我想保存一个实体(如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]; } } } } -(void)relationshipInstancesForManagedObject:(NSManagedObject*)managedObject andSkipValue:(id)skipValue andSet:(NSMutableSet*)集 { for(managedObject.entity.properties中的NSRelationshipDescription*关系) { 如果(![RelationshipDescription类:[nsrrelationshipDescription类])继续; id值=[managedObject值forkey:relationship.name]; 如果(value==skipValue | | value==nil | | value==self | |[set containsObject:value])继续; NSLog(@“%@”,值); if(relationship.istomy) { if([value containsObject:skipValue]| |[value containsObject:managedObject]| |[value count]==0){ 继续; } 对于(NSManagedObject*实体的值) { [设置添加对象:实体]; [self-relationshipInstancesForManagedObject:实体 和skipValue:skipValue andSet:set]; } }否则{ 如果(值!=nil){ [设置addObject:value]; [self-relationshipInstancesForManagedObject:值 和skipValue:skipValue andSet:set]; } } } }
如果您有任何想法,我将不胜感激。

解决您问题的最简单方法是确保将所有对象添加到存储时都有效。首先收集创建有效对象所需的信息,然后再添加新对象以及所有必需的信息


也要仔细考虑是否需要当前所做的所有属性。如果您有两个实体,每个实体都与另一个实体有关系,那么是否需要两种关系?你可以选择其中一种关系吗?这可以帮助您避免鸡和蛋的问题,即无法为任一实体添加对象,因为还不存在任何其他类型的对象。

尽量不要将实体与对象混淆。与类一样,实体描述一种特定类型的托管对象——给定实体的所有对象都将具有相同的属性集。谢谢。这是我最后的解决办法。确保数据在保存时有效。在选项卡更改时,我将发布一条消息,让用户知道如果他不保存数据,信息将丢失,然后根据用户选项删除/保存数据。@victorash如果这是您的最终解决方案,您应该接受Caleb的回答。