2011-12-15 90 views
0

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

问题:

当我点击添加实体插入被创建并添加到上下文。

所以,我去第一个选项卡上,单击添加 - 一个实体是在上下文中。 我在其他选项卡上,我点击添加 - 另一个实体是在上下文中。

我完成添加其中一个信息(有效)并点击保存。 现在核心数据会抛出一个异常,说无法保存上下文,因为其他实体无效。那我脑子里浮现

一个想法是:

复制是从上下文中无效的所有对象,保存上下文,添加复制者背部(等需要的时候)。

但是一个实体可能与其他实体有其他关系,所以人们可以拥有地址,角色,联系方式..以及公司可以有地址,雇用..等 如果人无效并且有关系地址有效,失败是因为不会保存人,但会保存地址,这是不正确的。

临时上下文可以工作,但我没有清楚的想法如何实现这一点。

另一个想法是,当我想保存它时,为一个实体(例如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

尽量不要将实体与对象混淆。像一个类一样,一个实体描述了一个特定类型的被管理对象 - 一个给定实体的所有对象都具有相同的一组属性。 – Caleb 2011-12-24 15:02:52

回答

1

问题的最简单的解决方案是确保所有对象在将其添加到商店时都有效。首先收集您需要创建有效对象的信息,然后添加一个新对象以及所有必需的信息。

此外,请仔细考虑是否需要要求您目前所有的属性。如果你有两个实体和另一个实体有关系,你是否需要两个关系?你可以让其中一个关系是可选的吗?这可以帮助您避免无法为任何实体添加对象的鸡和蛋问题,因为还没有其他类型。

+0

谢谢。那是我最终的解决方案。确保数据在保存时有效。在标签更改时,我会发布一条消息,让用户知道如果他不保存数据,然后根据用户选项删除/保存数据,则信息将丢失。 – victorash 2012-01-16 13:36:32