我正在使用Core Data创建一个基于文档的项目,并且遇到了对我来说可能只是一个概念问题,因为虽然我不是Cocoa的新手,但这是我第一次尝试使用Core Data。我想要完成的工作应该相对简单:每次启动新文档时,我都希望创建一个我的模型对象的新实例作为“根”对象。
我所做的是将NSObjectController添加到我的xib,将其模式设置为Entity Name(提供正确的实体名称),选中“Prepares Content”,并将其托管对象上下文绑定到File的Owner with managedObjectContext作为模型关键路径。为了测试这个,我将主窗口的标题绑定到对象控制器,控制器键作为选择,模型键路径作为我实体中的一个键。
我知道我可以通过编程方式创建我的根对象,但我正在尝试采用Apple推荐的中介模式。我已经在“采用中介模式”一节中看到了部门员工教程中的说明,详细步骤正是我相信我所做的。
有什么想法吗?
编辑: 也许我没有正确陈述问题。模型是在Core Data中创建的,关系是根据我的需要设置的(使用“root”,子项和叶子,使用to-one父关系,to-many children关系和isLeaf boolean属性)。我的问题是确保每次启动新文档时将此根对象实例化为单例。根对象与当前文档之间应该只有1:1的关系,根对象必须始终存在并且无需任何用户交互即可创建它,并且创建并附加到根的子节点是数据对象由应用程序使用和操作。
我已经以编程方式实现了上述功能,但是为了与Core Data原则保持一致,我们希望完全采用中介模式,而不是在应用程序逻辑中管理任何数据对象的创建。
答案 0 :(得分:0)
如果您想要在链表或树中找到“root”托管对象,则必须在数据模型本身中进行设置。
默认情况下,Core Data数据模型在对象之间没有特定的层次结构。对象可能是相关的,但没有对象在逻辑上“高于”或“低于”另一个对象。您可以通过从任何其他对象开始并将关系/ s返回到所需对象来达到任何关系中的对象。
托管对象的层次结构需要像这样的树结构:
Tree{
nodeName:string
parent<-->>Tree.children
children<<-->Tree.parent
}
...以便“root”对象是具有Tree
的唯一parent==nil
个实例。
说了这些之后,我想指出你提到的Apple文档说在大多数情况下使用这种类型的内置层次结构最好 NOT 。这只是用于演示目的的简化(我认为这是一个糟糕的。)
数据模型旨在模拟/模拟应用处理的真实对象,条件或事件。因此,模型/图形中的实体/对象之间的逻辑关系应该反映真实世界的关系。在这种情况下,除非您正在建模的真实世界存在于具有真实世界“根”对象,条件或事件的层次结构中,否则您的模型也不应该具有。