复合关键问题Realm Swift

问题描述:

我正尝试将json对象存储到realm对象使用Objectmapper我收到来自Alamofire的响应后。下面是我写的代码:复合关键问题Realm Swift

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作为我的主键。我从compoundKey建设primaryKey如下:

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() 
} 

compoundKeyGithub issues的定义在这里。我有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) 
}