【问题标题】:Core Data: inverse relationship for two relationships with same type核心数据:具有相同类型的两个关系的反向关系
【发布时间】:2011-06-26 11:38:10
【问题描述】:

在我的应用核心数据模型中,我有工作表和文本实体。工作表实体可以有两个文本:privacyNotes 和 termsOfUse。

均为文本类型。因此,在 XCode 数据建模器中,我在带有文本目标的 Sheet 中创建了名为“privacyNotes”和“termsOfUse”的一对一关系。接下来是文本中的一对一关系“工作表”。然后我选择 Text.sheet 关系作为 Sheet.privacyNotes 的逆关系。到目前为止,一切都很好。但是当我将相同的 Text.sheet 关系设置为 Sheet.termOfUse XCode 的反向时,XCode 会将此关系删除为反向 Sheet.privacyNotes!

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

【问题讨论】:

    标签: core-data


    【解决方案1】:

    深入了解抽象层可能会有所启发*:一个关系只能与另一个关系正好相反,因为在后备存储中,它们由相同的数据表示。如果 Text 和 Sheet 可以有某种关系,Core Data 会做一个优秀的人类数据建模者会做的事情,并尽可能简洁地存储这种关系。实体对象的关系属性只是查看该关系的方式。

    要获得您想要的效果:继续并为 privacyNote 和 termsOfUse 提供工作表属性;但是给出像 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”但不能同时是两者的约束,请按照 Apple 在docs,并在设置时将其他属性设为 null。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,但是那些 Sheet 便利方法必须测试两个 Text 实体的类型,这似乎有点浪费。如果我们 [已经] 订购了关系会更好,这样您就可以决定始终将 privacyNote 放在首位。
      • 我遇到了类似的设计问题。存储类型的想法正是我所需要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多