核心数据:多对多关系&模型

时间:2011-06-04 00:45:29

标签: objective-c cocoa macos core-data

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

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

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

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

我是否正确地完成了这项工作,或者我错过了什么?谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

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