2011-05-31 57 views
11

我有兩個實體,我將調用A和B.它們在兩個方向上都配置有多對多關係,因此A.myBs和B.myAs都是NSSets。核心數據反向關係沒有設置

這是我奇怪的問題。

當我添加一個B到我的A實體,我使用mutableSetValueForKey這個樣子:

NSMutableSet *myBSet = [myA mutableSetValueForKey:@"myBs"]; 
[myBSet addObject:theBtoAdd]; 

但這將theBtoAdd添加到一個實體,但不會添加反比關係。核心數據上下文保存不會踢任何錯誤,但我的A對象沒有B反轉集。如果我退出應用程序,即使部分關係也不會保存。

這是奇怪的部分...如果我只是切換我的代碼,並做相反的(有理由爲什麼這是很難做我的特定應用程序) - 添加A到B而不是像這樣添加B到A :

NSMutableSet *myASet = [myB mutableSetValueForKey:@"myAs"]; 
[myASet addObject:theAtoAdd]; 

它工作得很好。順便說一句,我有很多其他的多對多關係可行。只是這一個沒有。 1)我的核心數據對象模型看起來不錯,但這是我在Xcode 4下添加的第一個新實體 2)我已經檢查,重新檢查並且盲目地看着我的自定義NSManagedObjects,但他們看起來很好 - 宣佈動態,NSSet,沒有衝突的setter/getters ...等。

任何幫助或調試的建議將不勝感激。謝謝!

+0

你有沒有想過這一個?我被困在同樣的問題:( – edsko 2011-08-18 21:22:51

回答

6

我剛剛有同樣的問題,這就是爲什麼我看到這個問題。也許我的解決方案將幫助一些人在相同的情況下。

對於我的回答是,在NSManagedObject子類中我有過riden:

- (void)willChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects 

- (void)didChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects 

這避免了正確的通知發送到父類(NSManagedObject),該處理自動反向關係。

+0

這對我也有幫助。請記住爲 - (void)didChangeValueForKey:(NSString *)鍵也做同樣的事情; (普通值) – Lukasz 2012-09-13 21:24:09

+0

在我的代碼庫中產生了一個愚蠢的錯誤,但是這個答案指出了問題出在哪裏,所以你已經得到了我的讚賞。謝謝你,先生。 – LeffelMania 2014-06-16 06:20:56

0

如果您是託管對象的子類,那麼不應該有自動生成的多對多關係方法嗎?所以你只需要打電話:

[aObject addBObject:bObject]; 
+0

是的,我可以並且嘗試過,結果相同。我特別關注http://stackoverflow.com/questions/4206788/how-to-get- at-a-relationship-items-properties-in-core-data和使用mutableSetValueForKey。 – 2011-06-02 19:01:47

1

我發現錯誤,如果你是覆蓋所有的這些方法

// KVO change notification 
- (void)willChangeValueForKey:(NSString *)key; 
- (void)didChangeValueForKey:(NSString *)key; 
- (void)willChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects; 
- (void)didChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects; 

就會造成NSManagedObject不能很好工作和關係將無法正確設置

蘋果文檔:您不得重寫這些方法。