复合键问题Realm Swift

问题描述 投票:8回答:2

我收到来自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()
}

根据compoundKey定义的Github issues就在这里。我有31个字典存储在我的数据库中,但我只能存储最后一个字典。我确信这是一个复合键问题,因为此代码库能够将数据存储在另一个具有唯一字段作为主键的表中,而在此数据库表中并非如此。我是否宣布我的compoundKey错了?

ios json swift3 realm objectmapper
2个回答
1
投票

我没有使用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错误,则必须是在初始化后未成功更改compoundKeys。然后你应该检查那部分。也许您应该手动调用它,或覆盖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)
}

0
投票

我的回答在这里:

https://stackoverflow.com/a/55725209/10483501

dynamic private var compoundKey: String = ""

required convenience init?(map: Map) {
  self.init()
  if let firstValue = map.JSON["firstValue"] as? String,
    let secondValue = map.JSON["secondValue"] as? Int {
    compoundKey = firstValue + "|someStringToDistinguish|" + "\(secondValue)"
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.