Realm主键与OR运算符

时间:2017-08-11 09:48:37

标签: swift realm objectmapper

我正在使用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是主键。

怎么做?

2 个答案:

答案 0 :(得分:2)

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

如果您想更改idtempId,请不要按照常规方式进行更改,而是通过其设置器功能进行更改。

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

答案 1 :(得分: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)"
  }
}