3 回答

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
在實(shí)踐中,由于沒(méi)有反向,我沒(méi)有任何數(shù)據(jù)丟失 - 至少我知道。谷歌快速建議你應(yīng)該使用它們:
反向關(guān)系不僅使事情更加整潔,它實(shí)際上被Core Data用于維護(hù)數(shù)據(jù)完整性。
您通常應(yīng)該在兩個(gè)方向上建模關(guān)系,并適當(dāng)?shù)刂付ǚ聪蜿P(guān)系。如果進(jìn)行了更改,Core Data會(huì)使用此信息來(lái)確保對(duì)象圖的一致性(請(qǐng)參閱“操作關(guān)系和對(duì)象圖完整性”)。有關(guān)您可能不想在兩個(gè)方向上建模關(guān)系的一些原因的討論,以及可能出現(xiàn)的一些問(wèn)題,請(qǐng)參閱“單向關(guān)系”。

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊
Apple文檔有一個(gè)很好的例子,表明你可能因?yàn)闆](méi)有反向關(guān)系而遇到問(wèn)題。讓我們把它映射到這種情況。
假設(shè)您將其建模如下: 在此輸入圖像描述
注意:您有一個(gè)到一個(gè)所謂的“關(guān)系型 ”,從SocialApp到SocialAppType。該關(guān)系是非可選的,并且具有“拒絕”刪除規(guī)則。
現(xiàn)在考慮以下內(nèi)容:
SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated
[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];
BOOL saved = [managedObjectContext save:&error];
我們期望失敗此上下文保存,因?yàn)槲覀円褜h除規(guī)則設(shè)置為拒絕,而關(guān)系不是可選的。
但是這里的保存成功了。
原因是我們沒(méi)有設(shè)置反比關(guān)系。因此,當(dāng)刪除appType時(shí),socialApp實(shí)例不會(huì)被標(biāo)記為已更改。因此,在保存之前沒(méi)有對(duì)socialApp進(jìn)行驗(yàn)證(它假定不需要驗(yàn)證,因?yàn)闆](méi)有發(fā)生任何更改)。但實(shí)際上發(fā)生了變化。但它沒(méi)有得到反映。
如果我們回想一下appType
SocialAppType *appType = [socialApp socialAppType];
appType為零。
很奇怪,不是嗎?我們得到一個(gè)非可選屬性為零?
如果你建立了反向關(guān)系,那么你沒(méi)有遇到麻煩。否則,您必須通過(guò)編寫代碼進(jìn)行強(qiáng)制驗(yàn)證,如下所示。
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貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
我將解釋我在Dave Mark和Jeff LeMarche的更多iPhone 3開發(fā)中找到的明確答案。
Apple通常建議您始終創(chuàng)建并指定反向,即使您不在應(yīng)用程序中使用反向關(guān)系。因此,當(dāng)您未能提供反向時(shí),它會(huì)發(fā)出警告。
關(guān)系不需要具有逆,因?yàn)樵谝恍﹫?chǎng)景中,逆關(guān)系可能會(huì)損害性能。例如,假設(shè)反向關(guān)系包含極大數(shù)量的對(duì)象。去除逆需要迭代表示反向弱化性能的集合。
但除非你有特殊的理由不這樣做,否則建模。它有助于核心數(shù)據(jù)確保數(shù)據(jù)完整性。如果遇到性能問(wèn)題,以后刪除反向關(guān)系相對(duì)容易。
- 3 回答
- 0 關(guān)注
- 563 瀏覽
添加回答
舉報(bào)