我目前正在通过调用 Realm.create(T.self, value: object, update: true) 来实现插入或更新模式。 object
是从剩余调用返回的 JSON,它可能包含与该 Realm 对象关联的部分或全部属性。 (换句话说,我需要支持部分更新。)
在许多 JSON 对象中,都有一个名为 description
的键。由于我无法拥有带有名为 publicdynamic vardescription
的属性的 Realm 对象子类,因此我需要选择另一个名称,并确保在调用 realm.create
时正确映射它。我知道你在想什么,我可以在调用 create 之前进行映射。然而,JSON 也可能有嵌套对象/对象数组,当 Realm 已经知道这些对象映射到哪里时,为所有嵌套属性设置映射对我来说似乎是多余的。如果我可以简单地在每个 Object
子类中定义一个映射,然后 Realm 可以计算出其余部分,那就更清晰了。
我解决这个问题的第一次尝试是覆盖 Object
的 init
函数(尽管注释明确指出不要这样做,但必须尝试),但这不起作用,因为实际上,没有使用 Realm.create 调用任何接受 JSON 对象的 init 方法。
有什么办法可以让我在这里的生活更轻松吗?
注意:我使用的是 Swift 2.0 和 Realm 的 swift-2.0
分支
最佳答案
使用 Swift 时,Realm 仍然不支持正确的映射,所以让我详细说明一下 jpsim 注释。
ObjectMapper提供了强大的映射机制,它不仅可以让您选择模型属性名称,还可以很好地处理映射过程中可能需要的任何清理。
这是我为 dummy project 编写的示例:
import ObjectMapper
class Color: RLMObject, Mappable{
dynamic var myId = 0
dynamic var myTitle = ""
dynamic var username = ""
dynamic var hex = ""
override static func primaryKey() -> String?{
return "id"
}
required convenience init?(_ map: Map){
self.init()
}
static func mappedColor(dict:Dictionary<String, AnyObject>) -> Color{
return Mapper<Color>().map(dict)! as Color
}
func mapping(map: Map) {
id <- map["id"]
title <- map["title"]
username <- map["userName"]
hex <- map["hex"]
}
}
您可以看到我有一个链接到 ObjectMapper Mappable
协议(protocol)的 mapping
函数,以及一个 mappedColor
函数,仅此而已这不是映射 JSON 来检索模型对象的便捷方法。
然后我可以在 Web 服务调用响应中使用它,如下所示:
[...]
if let JSON:Array = response.result.value as? Array<[String: AnyObject]> {
do{
try RLMRealm.defaultRealm().transactionWithBlock {
for dict in JSON{
let color = Color.mappedColor(dict)
RLMRealm.defaultRealm().addOrUpdateObject(color)
}
}
} catch let error as NSError {
print(error)
}
}
[...]
关于swift - 如何在 Realm.create 中将 JSON 属性正确映射到模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32380943/