如何正确处理realm.io关系的创建和更新

时间:2015-02-11 20:04:49

标签: ios swift realm

我有两个RLMObjects

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"
    }
}

正如您所看到的,时间轴和条目之间存在To-Many关系。时间轴有很多条目。

JSON获取和我的时间轴分配工作正常,它们被提取并设置为:

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

当我尝试获取给定时间轴的条目(这是一个单独的JSON请求/响应)并设置它们时,我的问题就出现了。

像这样获取和创建它们可以正常工作:

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

但当然,它并没有将它们与我的时间轴对象相关联。然后我尝试获取我的Timeline对象,然后通过执行以下操作将Entry对象添加到我的时间轴:

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

(在c的交易中)。

这适用于初始提取。但是当我尝试重新获取您的数据时,您会得到以下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 个答案:

答案 0 :(得分:5)

尝试添加从Entry调用返回的createOrUpdate对象。