复合键问题 Realm Swift

Posted

技术标签:

【中文标题】复合键问题 Realm Swift【英文标题】:Compound key issue Realm Swift 【发布时间】:2017-07-24 09:36:33 【问题描述】:

在收到来自Alamofire 的响应后,我正在尝试使用Objectmapperjson 对象存储到realm 对象。下面是我写的代码:

  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 错误?

【问题讨论】:

【参考方案1】:

我的回答在这里:

https://***.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)"
  

【讨论】:

【参考方案2】:

我没有使用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)

【讨论】:

以上是关于复合键问题 Realm Swift的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift for Realm 模型中设置主键

复合主键领域/ swift

在 Swift 应用程序中安装 Realm

Swift 中 Realm 查询的交叉引用谓词

在 iOS 7 上使用 Realm 和 Swift

使用 Swift 过滤 Realm 对象