ios - 如何使用 Realm 以正确的方式对这个 json 进行建模?

标签 ios iphone swift realm

这是我第一次与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"
    }
}

我收到了这样的错误:

Terminating app due to uncaught exception 'RLMException', reason: 'Can not add objects from a different Realm'

最佳答案

如果我正确理解你的问题,你需要使用 TransformType 来解释如何映射列表

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
}

}

关于ios - 如何使用 Realm 以正确的方式对这个 json 进行建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44211707/

相关文章:

ios - 强制转换从 'Data?' 到 'Data' 只解包选项;您是要使用 '!' 吗?

ios - UINavigationBar BarButtomItem 不会 swift 解除 View Controller

iphone - 当用户按下 iPhone 上的主页按钮时,如何将数据保存在文本文件中?

swift - 缺少所需的模块 Firebase - Jenkins 构建错误

swift - 如何让返回等待计算完成

iphone - 当从 iOS4 的后台重新唤醒时,如何更新 View 的数据?

ios - 使用 JSON 将 iTunes 中的图像解析为 tableviewcontroller

php - PHP 加密,IOS 解密

iphone - 如何使用swift在游戏中心报告高分

iphone - 将typedef结构转换为NSMutableArray