我有關於核心數據的問題。 我有一個應用程序與多個選項卡。每個選項卡都包含不同「對象」的列表。 在每個標籤中,我有一個添加按鈕(+),可以將我帶到一個可以添加「對象」的屏幕。核心數據多個實體
問題:
當我點擊添加實體插入被創建並添加到上下文。
所以,我去第一個選項卡上,單擊添加 - 一個實體是在上下文中。 我在其他選項卡上,我點擊添加 - 另一個實體是在上下文中。
我完成添加其中一個信息(有效)並點擊保存。 現在覈心數據會拋出一個異常,說無法保存上下文,因爲其他實體無效。那我腦子裏浮現
一個想法是:
複製是從上下文中無效的所有對象,保存上下文,添加複製者背部(等需要的時候)。
但是一個實體可能與其他實體有其他關係,所以人們可以擁有地址,角色,聯繫方式..以及公司可以有地址,僱用..等 如果人無效並且有關係地址有效,失敗是因爲不會保存人,但會保存地址,這是不正確的。
臨時上下文可以工作,但我沒有清楚的想法如何實現這一點。
另一個想法是,當我想保存它時,爲一個實體(例如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