嗨在我的应用程序核心数据模型中,我有工作表和文本实体.Sheet实体可以有两个Text:privacyNotes和termsOfUse.两种文字类型.因此,在XCode数据建模器中,我在Sheet with Text目标中创建称为"privacyNotes"和"termsOfUse"的一对一关系.接下来是文本中的一个关系"工作表".然后我选择Text.sheet关系作为Sheet.privacyNotes的反向关系.到现在为止还挺好.但是当我将相同的Text.sheet关系设置为与Sheet.termOfUse相反时,XCode将此关系删除为反向Sheet.privacyNotes!我理解与Objective-C对象关系相比,DB中的关系可以不那么简单,但我真的不明白为什么SQLite或(CoreData)不能将一个关系重用为FEW其他关系的反转?
rge*_*rge 13
抽象引擎下的一点看法可能具有启发性*:关系只能与其他关系完全相反,因为在后备存储中,它们由相同的数据表示.如果Text和Sheet可以有一定的关系,Core Data会做一个优秀的人工数据建模器,并尽可能简洁地存储这种关系.实体对象的关系属性只是查看该关系的方式.
要获得您想要的效果:继续并为privacyNote和termsOfUse提供Sheet属性; 但是给出像SheetIAmTermsFor和sheetIAmPrivacyNoteFor这样的Text属性,并将它们设置为适当的反转.然后在Text类中,沿这些行添加合成属性:
// in interface
@property (nonatomic, readonly) Sheet *sheet;
// in impl
-(Sheet *)sheet
{
if ([self sheetIAmTermsFor])
return [self sheetIAmTermsFor];
else
return [self sheetIAmPrivacyNoteFor];
}
Run Code Online (Sandbox Code Playgroud)
如果你也想编写一个setter,你必须决定setter应该赋予Text哪个角色(Core Data无法为你找到,另一个原因是属性不能与两个不同的属性相反) .)
如果您需要强制执行一个约束,即Text只能是"privacyNote"或"terms"但不能同时使用两者,请覆盖sheetIAmTermsFor和sheetIAmPrivacyNoteFor的setter,遵循Apple在文档中的模式,并在每个属性为null时使其为null组.
(*Apple认为SQLite数据库核心数据生成为其实现的私有,但检查他们的模式可能非常有教育意义.只是不要试图编写CD背后的运输代码直接戳到数据库.)
最好在Sheet和Text之间建立一对多的关系,验证限制为2.然后你应该在文本中有一个type属性,声明它为a privacyNotes或termsOfUse.从那里,您可以为Sheet子类添加便捷方法,允许您检索其中任何一个.
| 归档时间: |
|
| 查看次数: |
3113 次 |
| 最近记录: |