2014-10-08 72 views
0

我想将我的核心数据对象图移动到领域。在领域的亲子关系

目前,我有一个实体,称为DBNode,其中有

@NSManaged var children: NSSet 
@NSManaged var parentNode: DBNode 

在那里我可以存储父节点和节点的所有孩子。

当我有叫RLMNode一个境界对象:RLMObject与

dynamic var children = RLMArray(objectClassName: RLMNode.className()) 
dynamic var parent = RLMNode() 

它时,第一次尝试添加一个对象崩溃。

我可以在Realm中做这个层次结构吗?

编辑:

看来我能做到这一点,就必须在阵列中的一个节点:

dynamic var parent = RLMArray(objectClassName:RLMNode.className()) 

请问这是推荐的方法?它与核心数据中的对象图一样快吗?

+0

只是两个问题,为了更好地理解你的问题:首先连接回父母的目的是什么?为什么父母是一个数组,而不是一个对象链接? – Gusutafu 2014-10-08 09:58:24

+0

这样我就可以在树层次结构中前后移动。 Parent保存当前节点的父节点,并且子节点保存当前节点的所有子节点。在核心数据中,父类不是数组,但是在Realm中,我发现RLMArray不需要被初始化并且可以为零,所以绕过Realm的要求(如果它实际上是要求的话)是一种破解。 – Caroline 2014-10-08 11:58:29

回答

2

崩溃的原因可能是初始化变成递归的,当你创建一个节点的时候它会为它的父节点创建一个节点,而这又需要一个节点等等。你可以检查堆栈跟踪来查看是否是这种情况。

境界斯威夫特支持可选的对象属性,它们默认设置为无,所以你可以做这样的事情:

class DBNode: RLMObject { 
    dynamic var name = "" 
    dynamic var parent: DBNode? 
    dynamic var children = RLMArray(objectClassName: DBNode.className()) 
} 

阵列可事实上是零,他们确实有被初始化,但它们可以是空的。

请注意,如果明确地将对象及其父项(或子项)同时添加到域,则可能会收到异常。由于您无法链接到未保留的对象,因此它们将自动添加。

+0

优秀 - 作品,谢谢。是的,它是递归的 - 没有意识到我可以添加一个零父项。 Realm的浏览器也很好地显示了树的内容。 – Caroline 2014-10-08 23:18:52