复合关键问题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()
}
和compoundKey
按Github 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)
}