我正在使用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
是主键。
怎么做?
答案 0 :(得分:2)
你需要的是一个计算属性作为主键。但是,目前不支持此功能,只有存储和管理的域属性可用作主键。解决方法可能是将id
和tempId
定义为具有显式的setter函数,并且在setter函数内部还需要设置另一个存储属性,这将是您的主键。
如果您想更改id
或tempId
,请不要按照常规方式进行更改,而是通过其设置器功能进行更改。
从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)"
}
}