我收到json的响应后,尝试使用realmObjectmapper对象存储到Alamofire对象。以下是我编写的代码:

  func getTodayData() {

    Alamofire.request("https://myapipoint.json").responseJSON{ (response) in

        guard response.result.isSuccess, let value = response.result.value else {
            return
        }
        let json = JSON(value)


        guard let realm = try? Realm() else {
            return
        }

        realm.beginWrite()

        for (_, value): (String, JSON) in json {

            let tpTodayOb = Mapper<TPToday>().map(JSONObject: value.dictionaryObject)

            realm.add(tpTodayOb!, update: true)
        }

        do {
            try realm.commitWrite()
        }
        catch {
            print("Error")
        }
    }
}

我可以从服务器映射json数据。但是,我的复合键有问题。这三个变量不是唯一的,但是它们的组合是唯一的,因此我不得不使用compoundKey作为主键。我正在从primaryKey构建compoundKey,如下所示:
public dynamic var compoundKey: String = "0-"

public override static func primaryKey() -> String? {
   // compoundKey = self.compoundKeyValue()
    return "compoundKey"
}

private func compoundKeyValue() -> String {

    return "\(yearNp)-\(mahina)-\(gate)"
}

这是我初始化三个变量的地方。
func setCompoundID(yearNp: Int, mahina: String, gate: Int) {
    self.yearNp = yearNp
    self.mahina = mahina
    self.gate = gate
    compoundKey = compoundKeyValue()
}

这里是根据Github issues定义的compoundKey。我有31个字典要存储在数据库中,但是我只能存储最后一个字典。我确定这是一个复合键问题,因为此代码库能够将数据存储在另一个表中,该表具有唯一的字段作为主键,而在此数据库表中则不是这种情况。我是否声明了compoundKey错误?

最佳答案

我没有使用Alamofire,所以我假设您在Alamofire部分上的代码是正确的。根据上下文,您没有提供JSON的结构,我假设您的JSON包含31个字典。另外,我一开始就认为Realm数据库是空的。如果没有,请使其为空。

我相信问题就在这里。

for (_, value): (String, JSON) in json {
    let tpTodayOb = Mapper<TPToday>().map(JSONObject: value.dictionaryObject)

    realm.add(tpTodayOb!, update: true)
}

请更改为
for (_, value): (String, JSON) in json {
    let tpTodayOb = Mapper<TPToday>().map(JSONObject: value.dictionaryObject)

    realm.add(tpTodayOb!, update: false) // you don't need `update:true`, unless you want to rewrite it intendedly
}

并运行您的项目。如果Realm抛出重复的id错误,则必须是初始化后未成功更改compoundKey。然后,您应该检查该部分。也许您应该手动调用它,或者覆盖init函数的相应部分。
for (_, value): (String, JSON) in json {
    let tpTodayOb = Mapper<TPToday>().map(JSONObject: value.dictionaryObject)
    tpTodayOb.setCompoundID(yearNp: Int, mahina: String, gate: Int)
    realm.add(tpTodayOb!, update: false)
}

10-08 04:49