我有两个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"
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,时间轴和条目之间存在To-Many关系.时间轴有很多条目.
我的时间轴的JSON提取和分配工作得很好,它们被提取并设置为:
realm.beginWriteTransaction()
Timeline.createOrUpdateInDefaultRealmWithObject(timelineObject)
realm.commitWriteTransaction()
Run Code Online (Sandbox Code Playgroud)
当我尝试获取给定时间轴的条目(这是一个单独的JSON请求/响应)并设置它们时,我的问题出现了.
像这样获取和创建它们可以正常工作:
realm.beginWriteTransaction()
Entry.createOrUpdateInDefaultRealmWithObject(entryObject)
realm.commitWriteTransaction()
Run Code Online (Sandbox Code Playgroud)
但当然,这并不会将它们与我的Timeline对象相关联.那么我尝试获取我的Timeline对象,然后通过执行以下操作将Entry对象添加到我的时间轴:
let timelineObject = Timeline(forPrimaryKey: id)
timelineObject.entries.addObject(entryObject)
Run Code Online (Sandbox Code Playgroud)
(在交易中).
这适用于初始提取.但是当我尝试重新获取您的数据时,您会得到以下RLMException:
'RLMException', reason: 'Can't set primary key property 'id' to existing value 59.'
Run Code Online (Sandbox Code Playgroud)
我做错了什么,或者这是一个错误?看起来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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4224 次 |
| 最近记录: |