swift - RealmSwift + ObjectMapper 管理字符串数组(标签)

标签 swift realm objectmapper

我需要在 RealmSwift 中表示的是以下 JSON 方案:

{ 
    "id": 1234,
    "title": "some value",
    "tags": [ "red", "blue", "green" ]
}

这是我遇到的一个基本字符串数组。我猜在 Realm 中我需要将“标签”表示为

dynamic id: Int = 0
dynamic title: String = ""
let tags = List<MyTagObject>()

在 Realm 中使标签成为自己的表,但如何使用 ObjectMapper 映射它?这就是我的进展......

func mapping(map: Map) {
    id <- map["id"]
    title <- map["title"]
    tags <- map["tags"]
}

... 但是标签行当然不会编译,因为列表和 Realm 不能使用 [String] 类型。

这感觉像是一个有点普遍的问题,我希望遇到过这个问题的人可以发表评论或指向一个带有建议的帖子。

更新 1 MyTagObject 如下所示:

class MyTagObject: Object {
    dynamic var name: String = ""
}

更新 2 我发现这篇文章处理 Realm 对象,但假设数组具有命名元素而不是简单的字符串。 https://gist.github.com/Jerrot/fe233a94c5427a4ec29b

最佳答案

我的解决方案是使用 ObjectMapper TransformType作为将 JSON 映射到 Realm 的自定义方法 List<String>类型。不需要 2 个 Realm 模型。

使用您的示例 JSON:

{ 
    "id": 1234,
    "title": "some value",
    "tags": [ "red", "blue", "green" ]
}
  1. 首先,创建一个 ObjectMapper TransformType对象:
import Foundation
import ObjectMapper
import RealmSwift

public struct StringArrayTransform: TransformType {

    public init() { }

    public typealias Object = List<String>
    public typealias JSON = [String]

    public func transformFromJSON(_ value: Any?) -> List<String>? {
        guard let value = value else {
            return nil
        }
        let objects = value as! [String] 
        let list = List<String>()
        list.append(objectsIn: objects)
        return list
    }

    public func transformToJSON(_ value: Object?) -> JSON? {
        return value?.toArray()
    }

}

  1. 创建用于存储 JSON 数据的 1 个 Realm 模型:
import Foundation
import RealmSwift
import ObjectMapper

class MyObjectModel: Object, Mappable {

    @objc dynamic id: Int = 0
    @objc dynamic title: String = ""
    let tags = List<MyTagObject>()

    required convenience init?(map: Map) {
        self.init()
    }    

    func mapping(map: Map) {
        id <- map["id"]
        title <- map["title"]
        tags <- (map["tags"], StringArrayTransform())
    }

}

完成!

这一行很神奇:tags <- (map["tags"], StringArrayTransform()) .这告诉 ObjectMapper 使用我们的自定义 StringArrayTransform我在上面展示了它采用 JSON String 数组并将其转换为 Realm List<String> .

关于swift - RealmSwift + ObjectMapper 管理字符串数组(标签),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40073212/

相关文章:

ios - 如何使用 ObjectMapper 映射这个简单的 JSON

ios - AlamofireObjectMapper/ObjectMapper是否支持struct类型映射

java - 使用 Jackson 解析 HTTP 请求负载

ios - CloudKit "Couldn' t 仅在设备上获取签名证书

ios - 不符合协议(protocol) 'NSCoding' - Swift 3

android - Realm db ChangeListener 持久性 - 内存泄漏

ios - NSPredicate 与 Realm 中的任何

Swift Firebase - 将数据库快照转换为数组

ios - audioEngine.start() 调用时抛出异常

android - 只向 Realm 添加唯一值