具有两个不同核心数据 NSManagedObject 实体的 NSTreeController

Posted

技术标签:

【中文标题】具有两个不同核心数据 NSManagedObject 实体的 NSTreeController【英文标题】:NSTreeController with two different core data NSManagedObject entities 【发布时间】:2011-06-26 16:47:45 【问题描述】:

我正在将我的 ios 应用程序移植到 Mac,并希望设置一个 NSTreeController 来管理实体的层次结构。此层次结构中有两种不同的 NSManagedObject 类型,Group 和 Item,它们具有一对多的关系(一个 Group 对多个 Items)。但是我在设置 NSTreeController 时遇到了麻烦;我收到一条错误消息:

[<NSManagedObject 0x10029c410> valueForUndefinedKey:]: the entity Item is not key value coding-compliant for the key "items".

似乎 NSTreeController 打算用 one 类型的 NSManagedObject 设置,其子代指 自身,并且让子代是不同类型的对象不起作用。它是否正确?如果是这样,我需要做些什么来纠正这个问题,同时保持新数据模型能够使用轻量级迁移从旧数据模型正确迁移?如果我确实能够用两种不同的 NSManagedObjects 完成 NSTreeObject,我应该如何设置呢?

【问题讨论】:

【参考方案1】:

NSTreeController 中使用的所有实体都必须响应setChildrenKeyPath: 设置的指定子消息。在本例中为items。换句话说,树结构中的所有对象都必须响应items 消息,即使该对象永远不会有任何子对象

例如假设你想为一个文件系统建模并用 NSTreeController 显示它。您必须有一个如下所示的数据模型:

FileSystemObject
  name:
  parent<<-->FileSystemObject.children
  children<-->>FileSystemObject.parent


Folder:FileSystemObject


File::FileSystemObject

然后您将覆盖为FileSystemObject 提供一个自定义方法,该方法将返回子项的数量。您可以使用setCountKeyPath: 向 NSTreeController 提供方法名称。覆盖Folder 中的方法以返回子项的实际计数,并覆盖File 以返回零。

这就是为什么没有很好地考虑 NSTreeController 的原因。与其他控制器不同,它通过强制您更改数据模型以满足 UI 的需求来破坏封装,这是非常糟糕的做法。

有人编写了一个替换树控制器,它自动假定任何不响应子键路径的对象都是叶子,并提供自动子节点计数为零。不幸的是,我现在找不到它,也不记得它叫什么了。

【讨论】:

以上是关于具有两个不同核心数据 NSManagedObject 实体的 NSTreeController的主要内容,如果未能解决你的问题,请参考以下文章

核心数据获取唯一属性

iPhone 核心数据:具有不同属性和字母部分的 NSFetchRequest

保存具有多个不同关系的相同类型的各种核心数据实体?

将两个 JSON 文件中的数据写入具有关系的核心数据模型

使用具有不同单元格数的部分的 UITableView 的核心数据

如何仅将具有不同属性的对象添加到核心数据到多关系 NSSet