亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

每個核心數據關系都必須有反向嗎?

每個核心數據關系都必須有反向嗎?

哈士奇WWW 2019-08-27 11:09:43
每個核心數據關系都必須有反向嗎?假設我有兩個實體類:SocialApp和SocialAppType在SocialApp我有一個屬性:appURL和一個關系:type。在SocialAppType我有三個屬性:baseURL,name和favicon。SocialApp關系的目的地type是單個記錄SocialAppType。例如,對于多個Flickr帳戶,會有許多SocialApp記錄,每條記錄都包含指向某個人帳戶的鏈接。會有一個SocialAppType針對“Flickr的”類型的記錄,所有SocialApp記錄將指向。當我使用這個模式構建一個應用程序時,我得到一個警告,即SocialAppType和之間沒有反比關系SocialApp。 /Users/username/Developer/objc/TestApp/TestApp.xcdatamodel:SocialApp.type: warning: SocialApp.type -- relationship does not have an inverse我需要反轉,為什么?
查看完整描述

3 回答

?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

在實踐中,由于沒有反向,我沒有任何數據丟失 - 至少我知道。谷歌快速建議你應該使用它們:

反向關系不僅使事情更加整潔,它實際上被Core Data用于維護數據完整性。

Cocoa Dev Central

您通常應該在兩個方向上建模關系,并適當地指定反向關系。如果進行了更改,Core Data會使用此信息來確保對象圖的一致性(請參閱“操作關系和對象圖完整性”)。有關您可能不想在兩個方向上建模關系的一些原因的討論,以及可能出現的一些問題,請參閱“單向關系”。

核心數據編程指南


查看完整回答
反對 回復 2019-08-27
?
梵蒂岡之花

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];


查看完整回答
反對 回復 2019-08-27
?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

我將解釋我在Dave Mark和Jeff LeMarche的更多iPhone 3開發中找到的明確答案。

Apple通常建議您始終創建并指定反向,即使您不在應用程序中使用反向關系。因此,當您未能提供反向時,它會發出警告。

關系不需要具有逆,因為在一些場景中,逆關系可能會損害性能。例如,假設反向關系包含極大數量的對象。去除逆需要迭代表示反向弱化性能的集合。

除非你有特殊的理由不這樣做,否則建模。它有助于核心數據確保數據完整性。如果遇到性能問題,以后刪除反向關系相對容易。


查看完整回答
反對 回復 2019-08-27
  • 3 回答
  • 0 關注
  • 573 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號