0

我正在使用 Core Data 创建一个基于文档的项目,并且遇到了对我来说可能只是一个概念性问题,因为虽然我对 Cocoa 并不陌生,但这是我第一次尝试使用 Core Data。我想要完成的事情应该相对简单:随着每个新文档的启动,我想要一个创建的模型对象的新实例,用作“根”对象。

我所做的是将 NSObjectController 添加到我的 xib,将其模式设置为实体名称(提供正确的实体名称),选中“准备内容”,并将其托管对象上下文绑定到文件的所有者, managedObjectContext 作为模型键路径. 为了测试这一点,我将主窗口的标题绑定到对象控制器,控制器键作为选择,模型键路径作为实体中的键之一。

我知道我可以通过编程方式创建我的根对象,但我正在尝试采用 Apple 推荐的中介模式。我已经在“采用中介者模式”部分下看到了部门员工教程中的说明,详细的步骤正是我相信我所做的。

有什么想法吗?

编辑:也许我没有正确说明问题。模型是在 Core Data 中创建的,并且根据我的需要设置关系(使用“根”、子节点和叶子节点,使用一对一父节点关系、多子节点关系和 isLeaf 布尔属性)。我的问题是确保每次启动新文档时都将此根对象实例化为单例。根对象和当前文档之间应该存在 1:1 的关系,该根对象必须始终存在并且无需任何用户交互即可创建它,并且创建并附加到根的子节点是数据对象由应用程序使用和操作。

我已经以编程方式实现了上述功能,但为了符合核心数据原则,我希望完全采用中介者模式,而不是在我的应用程序逻辑中管理任何数据对象的创建。

4

1 回答 1

0

如果您想要像在链表或树中找到的“根”托管对象,那么您必须在数据模型本身中进行设置。

默认情况下,Core Data 数据模型在对象之间没有特定的层次结构。对象可能是相关的,但没有对象在逻辑上“高于”或“低于”另一个对象。您可以通过从任何其他对象开始并将关系返回到所需对象来达到任何关系中的对象。

托管对象的层次结构需要像这样的树状结构:

Tree{
    nodeName:string
    parent<-->>Tree.children
    children<<-->Tree.parent
}

...因此“根”对象是Tree具有parent==nil.

说了这么多,我要指出的是,您所指的 Apple 文档说,在大多数情况下,最好不要使用这种类型的内置层次结构。这只是用于演示目的的简化(我认为这是一个糟糕的简化。)

数据模型旨在建模/模拟应用程序处理的真实世界对象、条件或事件。因此,模型/图中的实体/对象之间的逻辑关系应该反映现实世界的关系。在这种情况下,除非您正在建模的真实世界事物存在于具有真实世界“根”对象、条件或事件的层次结构中,否则您的模型也不应该有一个。

于 2011-04-21T17:34:22.300 回答