Core data 核心数据:两个同类型关系的反向关系

Core data 核心数据:两个同类型关系的反向关系,core-data,Core Data,在我的应用程序核心数据模型中,我有图纸和文本实体。图纸图元可以有两个文本:privacyNotes和termsOfUse 两者都是文本类型。所以在XCode数据建模器中,我在带有文本目的地的工作表中创建了名为“privacyNotes”和“termsOfUse”的一对一关系。接下来转到文本中的一个关系“表”。然后我选择Text.sheet关系作为sheet.privacyNotes的反向关系。到现在为止,一直都还不错。但是,当我将Text.sheet关系设置为sheet.termOfUse的in

在我的应用程序核心数据模型中,我有图纸和文本实体。图纸图元可以有两个文本:privacyNotes和termsOfUse

两者都是文本类型。所以在XCode数据建模器中,我在带有文本目的地的工作表中创建了名为“privacyNotes”和“termsOfUse”的一对一关系。接下来转到文本中的一个关系“表”。然后我选择Text.sheet关系作为sheet.privacyNotes的反向关系。到现在为止,一直都还不错。但是,当我将Text.sheet关系设置为sheet.termOfUse的inverse时,XCode会将此关系作为inverse sheet.privacyNotes删除


我知道,与Objective-C对象关系相比,DB中的关系可能并不简单,但我真的不明白为什么SQLite或(CoreData)不能将一个关系重用为其他几个关系的逆关系?

在工作表和文本之间使用一对多关系,验证限制为2,这样会更好。然后,文本中应该有一个type属性,该属性将其声明为
privacyNotes
termsOfUse
。从那里,您可以向Sheet子类添加方便的方法,使您可以检索其中任何一个。

在抽象罩下看一眼可能会有所启发*:一个关系只能与另一个关系正好相反,因为在后台存储中,它们由相同的数据表示。如果一个文本和一个工作表可以有某种关系,那么核心数据就会像一个优秀的人工数据建模师那样,尽可能简洁地存储这种关系。实体对象的关系属性只是查看该关系的方式

为了得到你想要的效果:继续,为privacyNote和termsOfUse提供图纸属性;但是,请为sheetIAmTermsFor和sheetIAmPrivacyNoteFor等文本属性指定,并将它们适当地设置为反转。然后在Text类中,沿以下几行添加合成特性:

// in interface
@property (nonatomic, readonly) Sheet *sheet;
// in impl
-(Sheet *)sheet
{
  if ([self sheetIAmTermsFor])
    return [self sheetIAmTermsFor];
  else
    return [self sheetIAmPrivacyNoteFor];
}
如果您也想编写一个setter,那么您必须决定setter应该赋予文本哪个角色(哪些核心数据不能为您理解,另一个原因是一个属性不能是两个不同属性的倒数)

如果需要强制文本只能是“privacyNote”或“terms”,但不能同时是“privacyNote”,请按照文档中的Apple模式,重写SheetiamTerms for和sheetIAmPrivacyNoteFor的设置器,并在设置时使每个设置器都为null,使另一个属性为null


(*苹果将SQLite数据库核心数据生成视为其实现的私有数据,但检查它们的模式非常有教育意义。只是不要试图编写在CD后面直接戳数据库的代码。)

是的,但是那些工作表便利方法必须测试两个文本实体的类型,这似乎有点浪费。如果我们[已经]有了有序关系,那就更好了,这样你就可以决定总是把
privacyNote
放在第一位。我遇到了类似的设计问题。存储类型的想法正是我所需要的。