【问题标题】:Core Data: To-Many Relationship & Model核心数据:对多关系和模型
【发布时间】:2011-06-04 00:45:29
【问题描述】:

我正在考虑将 Core Data 用于我正在编写的应用程序。但是,在阅读文档后,我不确定如何为特定关系建模。以下是基础知识:

我有一个名为“ProjectFile”的实体,它有一些基本的字符串属性。 (其中一个是磁盘上文件的路径——称之为“文件 X”——我的应用程序将要操作它。)但是,当应用程序操作文件 X 时,它可能还需要操作其他文件—— - 文件 Y 和文件 Z。

FileY 和 FileZ 与 fileX 一样,都是“ProjectFile”实体。所以我需要一种方法来告诉 Core Data “FileY 和 FileZ 与 FileX 相关联”。为此,我在名为“linkedFiles”的“ProjectFile”实体上创建了一个关系,并将目标设置为“ProjectFile”,反之设置为​​“linkedFiles”。然后我将其设置为“对多”关系,因为每个“ProjectFile”可能有多个链接文件。

这对我来说似乎是递归的,我不确定我是否正确地完成了它。 “链接”文件(fileY 和 fileZ)需要单独存在,就像 fileX 一样。我需要能够从“linkedFiles”关系中“删除”它们,但如果有意义的话,它们仍然单独存在。本质上,我只需要模型中不同对象之间的弱关系。

我这样做是否正确,还是我遗漏了什么?谢谢!

【问题讨论】:

    标签: objective-c cocoa macos core-data


    【解决方案1】:

    所以,你有一个看起来像这样的数据模型:

    ProjectFile{
      path:string
      infile<<-->>ProjectFile.infile
    }
    

    这会起作用,因为 (1) Core Data 关系具有方向性/基数,并且 (2) 每个对象都是唯一的。您可能会遇到麻烦的是删除规则。在这种情况下,您几乎必须使用No ActionNullify,否则可能会引发级联删除。这反过来又冒着创建orphaned 对象的风险,这些对象没有任何关系并且很难在对象图中找到和删除。

    更好的模型会在关系本身中编码更多信息。您正在建模的真实世界文件对象似乎与其他文件对象有两种不同的关系:(1)每个实例都有它操作的其他实例,(2)每个实例都有其他操作它的实例。所以,你的模型应该反映:

    ProjectFile{
      path:string
      toManipulateFiles<<-(nullify)->>ProjectFile.manipulatedByFiles
      manipulatedByFiles<<-(nullify)->>ProjectFile.toManipulateFiles
    }
    

    这明确了对象之间的类型关系,让您可以快速轻松地为任何特定操作获取正确的对象。您可以在一个关系上使用 Nullify 而不会孤立另一个关系上的对象。

    虽然不是很明显,但关系不仅仅是图形模型上的线条,它们是可以携带大量信息的实际活动对象。您需要在设计时考虑到这一点。

    【讨论】:

      猜你喜欢
      • 2017-12-11
      • 1970-01-01
      • 2013-10-27
      • 2012-03-08
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多