3 回答


TA貢獻1900條經驗 獲得超5個贊
Apple文檔有一個很好的例子,表明你可能因為沒有反向關系而遇到問題。讓我們把它映射到這種情況。
假設您將其建模如下: 在此輸入圖像描述
注意:您有一個到一個所謂的“關系型 ”,從SocialApp到SocialAppType。該關系是非可選的,并且具有“拒絕”刪除規則。
現在考慮以下內容:
SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated
[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];
BOOL saved = [managedObjectContext save:&error];
我們期望失敗此上下文保存,因為我們已將刪除規則設置為拒絕,而關系不是可選的。
但是這里的保存成功了。
原因是我們沒有設置反比關系。因此,當刪除appType時,socialApp實例不會被標記為已更改。因此,在保存之前沒有對socialApp進行驗證(它假定不需要驗證,因為沒有發生任何更改)。但實際上發生了變化。但它沒有得到反映。
如果我們回想一下appType
SocialAppType *appType = [socialApp socialAppType];
appType為零。
很奇怪,不是嗎?我們得到一個非可選屬性為零?
如果你建立了反向關系,那么你沒有遇到麻煩。否則,您必須通過編寫代碼進行強制驗證,如下所示。
SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated
[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];
[socialApp setValue:nil forKey:@"socialAppType"]
BOOL saved = [managedObjectContext save:&error];

TA貢獻1829條經驗 獲得超7個贊
我將解釋我在Dave Mark和Jeff LeMarche的更多iPhone 3開發中找到的明確答案。
Apple通常建議您始終創建并指定反向,即使您不在應用程序中使用反向關系。因此,當您未能提供反向時,它會發出警告。
關系不需要具有逆,因為在一些場景中,逆關系可能會損害性能。例如,假設反向關系包含極大數量的對象。去除逆需要迭代表示反向弱化性能的集合。
但除非你有特殊的理由不這樣做,否則建模。它有助于核心數據確保數據完整性。如果遇到性能問題,以后刪除反向關系相對容易。
- 3 回答
- 0 關注
- 573 瀏覽
添加回答
舉報