2014-10-08 95 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