2015-02-11 44 views
4

更新我有兩個RLMObjects如何正確處理創建和realm.io關係

class Timeline: RLMObject { 

    dynamic var entries = RLMArray(objectClassName: Entry.className()) 
    dynamic var id   = 0 
    dynamic var title  = "" 
    dynamic var coverPhoto = "" 
    dynamic var body  = "" 

    override class func primaryKey() -> String { 
     return "id" 
     } 
} 

class Entry: RLMObject { 


    dynamic var id   :Int = 0 
    dynamic var timelineID :Int = 0 
    dynamic var name  :String = "" 
    dynamic var caption  :String = "" 
    dynamic var body  :String = "" 
    dynamic var imageURL :String = "" 

    override class func primaryKey() -> String { 
     return "id" 
    } 
} 

正如你可以看到有一個時間軸和條目之間的一對多的關係。時間軸上有很多條目。

的JSON獲取和我的時間安排分配工作得很好,他們被取出,並設置:

realm.beginWriteTransaction() 
Timeline.createOrUpdateInDefaultRealmWithObject(timelineObject) 
realm.commitWriteTransaction() 

我的問題出現了,當我試圖獲取項目(這是一個單獨的JSON請求/響應)給定的時間線並設置它們。

獲取和創造他們喜歡這個工作得很好:

realm.beginWriteTransaction() 
Entry.createOrUpdateInDefaultRealmWithObject(entryObject) 
realm.commitWriteTransaction() 

當然,這並不將它們與我的Timeline對象關聯的,但。於是我試圖讓我的Timeline對象,然後通過做添加條目對象到我的時間表:

let timelineObject = Timeline(forPrimaryKey: id) 
timelineObject.entries.addObject(entryObject) 

(內部交易無氧銅)。

這適用於初始抓取。但是,當我試圖重新獲取你的數據,你會得到以下RLMException:

'RLMException', reason: 'Can't set primary key property 'id' to existing value 59.' 

我做得不對,或者這是一個錯誤?似乎應該有一個RLMObject實例方法來創建或更新產品,就像它的類方法一樣?

解決方案 作爲segiddins意見建議,您可以添加從類方法的返回:createOrUpdate ......然後添加回你的對象(在我的情況下,timelineObject.entries.addObject(entryReturn)

let realm = RLMRealm.defaultRealm()       
realm.beginWriteTransaction() 

for entry in json["entries"] { 

... 
//Process and map the JSON 
... 
let entryReturn = Entry.createOrUpdateInDefaultRealmWithObject(entryObject) 
timelineObject.entries.addObject(entryReturn) 

} 
realm.commitWriteTransaction() 
+1

嘗試添加從createOrUpdate調用返回的Entry對象嗎? – segiddins 2015-02-11 20:33:02

+0

它就像那個segiddins一樣簡單!謝謝。你不想m回答一個答案,所以它可以得到upvoted? Ps。多麼棒的框架! :) – Chris 2015-02-11 20:46:51

回答

5

嘗試添加從createOrUpdate調用返回的Entry對象