2011-02-13 72 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