【问题标题】:How can I model this json in the right way with Realm?如何使用 Realm 以正确的方式对这个 json 进行建模?
【发布时间】:2017-05-27 00:23:32
【问题描述】:

这是我第一次使用 Realm,我正在尝试对这个 JSON 进行建模,我也在使用 ObjectMapper

  {
    companies: [
        {
             id: "1",
             name: "Quisque ut",
             logo: "0",
             company_categories: [
                "1",
                "2"
             ]
        }
    ],
    categories: [
        {
             id: "1",
             name: "Category1"
        },
        {
             id: "2",
             name: "Category2"
        },
        {
             id: "3",
             name: "Category3" 
        }
    ]
 }

在我的应用中,这是我正在实现的代码

class Category: Object, Mappable {
    dynamic var id = ""
    dynamic var name = ""

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

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

    override static func primaryKey() -> String? {
        return "id"
    }
}

我的目标公司是这样的:

class Company: Object, Mappable {
    dynamic var id = ""
    dynamic var name = ""
    dynamic var logo = ""
    let categories = List<Category>()

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

    func mapping(map: Map) {
        id <- map["id"]
        name <- map["name"]
        logo <- map["logo"]

        var categories: [String]? = nil
        categories <- map["company_categories"]
        let realm = try! Realm()

        categories?.forEach { category in
            let categoryObject = realm.objects(Company.self).filter({ $0.id == category }).first
            self.categories.append(categoryObject!)
        }
    }

    override static func primaryKey() -> String? {
        return "id"
    }
}

我收到这样的错误:

由于未捕获的异常“RLMException”而终止应用程序,原因:“无法添加来自不同领域的对象”

【问题讨论】:

  • 我的建议是在没有 ObjectMapper 的情况下尝试所有过程。我认为问题出在引用中,如果引用对 Realm 至关重要,那么 ObjectMapper 创建的新对象就是问题所在。在我看来,您在与 (let categories = List()) 相关的代码中有错误的逻辑,首先是您声明变量的方式,其次是您尝试检索类别的方式,第三是为什么嵌套在类中但不是嵌套在 JSON 中,这不是编程的工作方式,ObjectMapper 也是如此。祝你好运。
  • 我同意达米安的观点。此外,您分享的代码片段不完整,至少有一个编译错误(realm.objects(Company.self) 应该是realm.objects(Category.self)),您还没有分享如何触发您看到的异常(快速尝试Company(JSONString: ... 不适用于您提供的 JSON,因为您有一组 Company 对象)。您需要提供更多信息以供他人帮助。

标签: ios iphone swift realm


【解决方案1】:

如果我正确理解了您的问题,您需要使用 TransformType 来解释如何映射 List

override func mapping(map: Map) {
    location <- map["location"]
    list <- (map["company_categories"], RealmListTransform<Category>())
}

这是我使用的一个扩展

class RealmListTransform<T: Object>: TransformType where T: Mappable {

typealias Object = List<T>
typealias JSON = [[String: Any]]

let mapper = Mapper<T>()

func transformFromJSON(_ value: Any?) -> List<T>? {
    let result = List<T>()
    if let tempArr = value as? [Any] {
        for entry in tempArr {
            let mapper = Mapper<T>()
            let model: T = mapper.map(JSONObject: entry)!
            result.append(model)
        }
    }
    return result
}

func transformToJSON(_ value: Object?) -> JSON? {
    var results = [[String:Any]]()
    if let value = value {
        for obj in value {
            let json = mapper.toJSON(obj)
            results.append(json)
        }
    }
    return results
}

}

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多