与OR运算领域的主键(Realm Primary key with OR operator)

2019-10-29 06:17发布

我使用RealmSwift为我的新的应用程序。 我的领域类有两个主键。 只是一个例子,我有一个领域模型(产品)是这样的: -

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 ,但它不会解决问题。

所以我想创建一个主键,例如如果id是有那么这是主键否则tempId是主键。

这个怎么做?

Answer 1:

基本上你需要的是一个计算的属性作为主键。 然而,这不是目前所支持,仅存储和管理领域属性可作为主键。 一种解决方法是界定这两个idtempId有明确的setter函数和setter函数里面,你还需要将其他存储的属性,这将是你的主键。

如果你想更改idtempId不做它用通常的方法,但做到这一点通过他们的setter函数。

取自理念这个 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 ""
    }
}


Answer 2:

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


文章来源: Realm Primary key with OR operator