swift - 如何在 Realm.create 中将 JSON 属性正确映射到模型属性

标签 swift realm

我目前正在通过调用 Realm.create(T.self, value: object, update: true) 来实现插入或更新模式。 object 是从剩余调用返回的 JSON,它可能包含与该 Realm 对象关联的部分或全部属性。 (换句话说,我需要支持部分更新。)

在许多 JSON 对象中,都有一个名为 description 的键。由于我无法拥有带有名为 publicdynamic vardescription 的属性的 Realm 对象子类,因此我需要选择另一个名称,并确保在调用 realm.create 时正确映射它。我知道你在想什么,我可以在调用 create 之前进行映射。然而,JSON 也可能有嵌套对象/对象数组,当 Realm 已经知道这些对象映射到哪里时,为所有嵌套属性设置映射对我来说似乎是多余的。如果我可以简单地在每个 Object 子类中定义一个映射,然后 Realm 可以计算出其余部分,那就更清晰了。

我解决这个问题的第一次尝试是覆盖 Objectinit 函数(尽管注释明确指出不要这样做,但必须尝试),但这不起作用,因为实际上,没有使用 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/

相关文章:

ios - SSZipArchive 从 Url 解压

iOS swift : Cannot Manipulate String: Value of type 'String' has no member 'firstIndex'

java - 检测要从 Realm 数据库中删除的对象

macos - 如何成功将 RealmSwift 添加到 Xcode?

ios - Realm ,对象已由另一个 Realm 管理

swift - 将 NSMutableData 的一部分复制到新的 NSMutableData 对象

ios - Swift - 嵌套对象的 JSON 序列化

ios - 在 UIButton 上找到 touchDragInside 发送事件的方向

java - com.getkeepsafe.relinker.MissingLibraryException : librealm-jni. 所以

ios - 将图像数组添加到 Realm 数据库