Realm主键与OR运算符

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

我正在使用RealmSwift作为我的新应用程序。 My Realm类有两个主键。举个例子,我有一个像这样的Realm Model(产品): -

class Product: Object, Mappable {

    dynamic var id: String? = nil
    dynamic var tempId: String? = nil
    dynamic var name: String? = nil
    dynamic var price: Float = 0.0
    dynamic var purchaseDate: Date? = nil

    required convenience init?(map: Map) {
        self.init()
    }

    //I want to do something like this
    override static func primaryKey() -> String? {
        return "id" or "tempId"
    }

    func mapping(map: Map) {
        id <- map["_id"]
        tempId <- map["tempId"]
        name <- map["name"]
        price <- map["price"]
        purchaseDate <- (map["purchaseDate"], DateFormatTransform())
    }

所以我在我的设备中创建一个领域对象,并使用主键tempId存储到领域数据库中,因为实际的主键是id,这是服务器生成的主键仅在报告同步后才会出现。因此,当我向服务器发送多个报告时,那些tempId服务器响应我回来与每个id映射的实际tempId。由于报告不仅是从我这边创建的,所以我不能将tempId作为主键。我想到了Compound primary key,但它无法解决问题。

所以我想创建一个主键,如if id那里那么那是主键,否则tempId是主键。

这该怎么做?

swift realm objectmapper
2个回答
2
投票

你需要的是一个计算属性作为主键。但是,目前不支持此功能,只有存储和管理的域属性可用作主键。解决方法可能是将idtempId定义为具有显式的setter函数,并且在setter函数内部还需要设置另一个存储属性,这将是您的主键。

如果你想改变idtempId不按常规方式去做,而是通过他们的setter函数来做。

this GitHub问题采取的想法。

class Product: Object {
    dynamic var id:String? = nil
    dynamic var tempId: String? = nil

    func setId(id: String?) {
        self.id = id
        compoundKey = compoundKeyValue()
    }

    func setTempId(tempId: String?) {
        self.tempId = tempId
        compoundKey = compoundKeyValue() 
    }

    dynamic var compoundKey: String = ""
    override static func primaryKey() -> String? {
        return "compoundKey"
    }

    func compoundKeyValue() -> String {
        if let id = id {
            return id
        } else if let tempId = tempId {
            return tempId
        }
        return ""
    }
}

0
投票
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.