如何正确处理 realm.io 关系的创建和更新
How to properly handle create and update for realm.io relationships
我有两个 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"
}
}
如您所见,时间轴和条目之间存在一对多关系。时间轴有很多条目。
我的时间线的 JSON 提取和分配工作正常,它们正在被提取和设置:
realm.beginWriteTransaction()
Timeline.createOrUpdateInDefaultRealmWithObject(timelineObject)
realm.commitWriteTransaction()
当我尝试获取给定时间线的条目(这是一个单独的 JSON request/response)并设置它们时,我的问题就出现了。
像这样获取和创建它们效果很好:
realm.beginWriteTransaction()
Entry.createOrUpdateInDefaultRealmWithObject(entryObject)
realm.commitWriteTransaction()
但这当然不会将它们与我的时间轴对象相关联。然后我尝试获取我的时间线对象,然后通过执行以下操作将条目对象添加到我的时间线:
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 上应该有一个实例方法来创建或更新产品,就像 class 方法一样?
解决方案
正如 segiddins 评论所建议的,您从 class 方法添加 return:createOrUpdate... 然后将 return 添加到您的对象(在我的例子中,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()
尝试添加从 createOrUpdate
调用返回的 Entry
对象。
我有两个 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"
}
}
如您所见,时间轴和条目之间存在一对多关系。时间轴有很多条目。
我的时间线的 JSON 提取和分配工作正常,它们正在被提取和设置:
realm.beginWriteTransaction()
Timeline.createOrUpdateInDefaultRealmWithObject(timelineObject)
realm.commitWriteTransaction()
当我尝试获取给定时间线的条目(这是一个单独的 JSON request/response)并设置它们时,我的问题就出现了。
像这样获取和创建它们效果很好:
realm.beginWriteTransaction()
Entry.createOrUpdateInDefaultRealmWithObject(entryObject)
realm.commitWriteTransaction()
但这当然不会将它们与我的时间轴对象相关联。然后我尝试获取我的时间线对象,然后通过执行以下操作将条目对象添加到我的时间线:
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 上应该有一个实例方法来创建或更新产品,就像 class 方法一样?
解决方案
正如 segiddins 评论所建议的,您从 class 方法添加 return:createOrUpdate... 然后将 return 添加到您的对象(在我的例子中,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()
尝试添加从 createOrUpdate
调用返回的 Entry
对象。