1

所以我有以下 JSON,我将它与 ObjectMapper 和 Realm 一起使用。

{
  "result": [
    {
      "id": 20,
      "types": [
        "now"
      ],
      "url": "/nl/whereto/ezrhgerigerg",
      "categories": [
        {
          "id": 39,
          "name": "Food "
        },
        {
          "id": 21,
          "name": "Varia"
        }
      ]
    },

我的问题是从“类型”中获取数据,对于数组中的某些项目,它表示“现在”或“稍后”,而对于其他项目是空的(因此,没有给出类型项目)。

我尝试在我的映射中执行以下操作:

class Publication: Object, Mappable {
    dynamic var id:Int = 0
    var typez  = List<getType>()
    dynamic var url:String?

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

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

    func mapping(map: Map) {
        id <- map["id"]
        typez <- map["types"]
        url <- map["url"]
    }
}

class getType: Object, Mappable {
    dynamic var text: String = ""


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

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

当我检查 Realm 数据库时,您可以看到 typez,一个 [getType] 数组已生成,但它对于所有项目都是空的(即使是类型为“现在”的项目)。其他两项(id 和 url)填写在数据库中。

我做错了什么,它不会保存到数据库中?

4

1 回答 1

2

因为 Realm 无法检测到分配List属性,因为List属性不是 Objective-C 类型。所以List属性应该被声明为let,而不应该是nil。您应该使用append/remove... /insert... method to modifying theList`。

所以你的代码

typez <- map["types"]

不起作用,因为您typez直接将值分配给属性。

解决方法如下:

func mapping(map: Map) {
    ...
    var typez: [String]? = nil
    typez <- map["types"]

    typez?.forEach { t in
        let obj = getType()
        obj.text = t
        self.typez.append(obj)
    }
    ...

首先,将映射的值存储到局部变量(它是字符串数组)。然后将字符串数组转换为对象。然后将对象附加到List属性。

于 2016-04-25T09:37:15.273 回答