2011-02-13 58 views
12

嗨 在我的應用核心數據模型中,我有Sheet和Text實體。表單實體可以有兩個文本:privacyNotes和termsOfUse。兩種文本類型。因此,在XCode數據建模器中,我在Sheet with Text目標中創建了稱爲「privacyNotes」和「termsOfUse」的一對一關係。下一步在文本中找到一個關係「表」。然後,我選擇該Text.sheet關係作爲Sheet.privacyNotes的反向。到現在爲止還挺好。但是,當我爲Sheet.termOfUse設置相同的Text.sheet關係時,XCode將此關係作爲反向Sheet.privacyNotes刪除! 我明白,與Objective-C對象關係相比,DB中的關係不是那麼簡單,但我真的不明白爲什麼SQLite或(CoreData)不能重複使用一個關係作爲其他關係的反例?核心數據:兩種關係相同類型的反向關係

回答

11

在抽象風格下的一點窺視可能是啓發*:一個關係只能是另一個關係的倒數,因爲在後備存儲中,它們由相同的數據表示。如果文本和工作表可以有一定的關係,Core Data會做一個好的人類數據建模師,並儘可能簡潔地存儲這種關係。實體對象的關係屬性只是查看這種關係的方式。

爲了得到你要做的事情的效果:繼續並給出圖紙屬性的隱私註釋和termsOfUse;但給文本屬性,如sheetIAmTermsFor和sheetIAmPrivacyNoteFor,並將它們設置爲反向。然後在文本類,沿着這些線路增加一個綜合性能:

// in interface 
@property (nonatomic, readonly) Sheet *sheet; 
// in impl 
-(Sheet *)sheet 
{ 
    if ([self sheetIAmTermsFor]) 
    return [self sheetIAmTermsFor]; 
    else 
    return [self sheetIAmPrivacyNoteFor]; 
} 

如果你想要寫一個setter過,你就必須決定哪個角色二傳手應該賜給文本(其中核心數據「T弄清楚你,另一個原因屬性不能是兩個不同性質的倒數)。

如果需要執行這一文本永遠只能是一個‘privacyNote’約束或「術語「,但從來都沒有,覆蓋sheetIAmTermsFor和sheetIAmPrivacyNoteFor的設置器,按照文檔中的Apple模式設置,並且在設置時每個屬性都爲null。 (* Apple認爲SQLite數據庫Core Data生成的私有數據庫實現,但是檢查他們的模式可能非常具有教育意義,只是不要試圖寫出運行代碼直接放在CD背後去直接訪問數據庫)

5

你最好在Sheet和Text之間建立一對多關係,驗證限制爲2.然後你應該在文本中有一個type屬性,聲明它爲privacyNotestermsOfUse。從那裏你可以添加便捷方法到你的Sheet子類,使你可以檢索任何一個。

+0

是的,但這些Shee​​t便利方法必須測試兩個Text實體的類型,這似乎有點浪費。如果我們[已經]已經訂購了關係,那麼會更好,因此您可以決定首先放置「隱私筆記」。 – 2011-03-29 08:41:18