核心数据:具有相同类型的两个关系的反向关系

HAR*_*IOR 17 core-data

嗨在我的应用程序核心数据模型中,我有工作表和文本实体.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背后的运输代码直接戳到数据库.)


Mar*_*rra 6

最好在Sheet和Text之间建立一对多的关系,验证限制为2.然后你应该在文本中有一个type属性,声明它为a privacyNotestermsOfUse.从那里,您可以为Sheet子类添加便捷方法,允许您检索其中任何一个.