2011-12-15 117 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