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

时间:2011-02-13 15:42:45

标签: core-data

您好 在我的应用程序Core Data模型中,我有Sheet和Text实体。 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其他关系的反转?

2 个答案:

答案 0 :(得分: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];
}

如果你也想编写一个setter,你必须决定setter应该赋予Text的哪个角色(Core Data无法为你找到,另一个原因是属性不能反过来两个不同的属性。)

如果您需要强制执行一个约束,即Text只能是“privacyNote”或“terms”但不能同时使用两者,请覆盖sheetIAmTermsFor和sheetIAmPrivacyNoteFor的setter,遵循Apple的模式docs,并在设置时使每个属性为null。

(* Apple认为SQLite数据库核心数据生成为其实现的私有,但检查他们的模式可能非常有教育意义。只是不要试图编写CD背后的运输代码直接戳到数据库。 )

答案 1 :(得分:6)

你最好在Sheet和Text之间建立一对多的关系,验证限制为2.那么你应该在文本中有一个type属性,将其声明为privacyNotes或{{1 }}。从那里,您可以为Sheet子类添加便捷方法,允许您检索其中一个。