我有一个 Realm 对象:
class RMovements: Object {
dynamic var name: String!
dynamic var _quantity: Double = 0
var quantity: Double {
get {
return _quantity / 1000
}
set {
_quantity = newValue * 1000
}
}
override static func primaryKey() -> String? {
return "name"
}
}
在 Realm 存储中创建这个对象之后
do {
try realm.write({
let m = RMovements()
m.name = "john"
m.quantity = 2
realm.add(m, update: true)
})
} catch _ {}
结果我得到了
RMovements {
name = john;
_quantity = 2000;
quantity = 2;
}
看起来不错!但现在我想将数量更改为 9
do {
try realm.write({
let m = realm.objects(RMovements).filter("name=%@", "john").last!
m.quantity = 9
realm.add(m, update: true)
})
} catch _ {}
惊喜来了
RMovements {
name = john;
_quantity = 9000;
quantity = 2;
}
_quantity 正确修改为9000,但是quantity还是2。 为什么数量还是2?它总是会返回第一个存储值,我不明白为什么。请帮忙。
演示项目可在 GitHub 上获得
最佳答案
这里发生的事情是 quantity
属性没有包含在 ignoredProperties()
中以让 Realm 知道不要持久化它,但它也没有被标记为 dynamic
,使 Realm 能够管理属性。
所以它处于不受支持的中间状态。我建议您将该属性标记为已忽略:
class RMovements: Object {
dynamic var name: String!
dynamic var _quantity: Double = 0
var quantity: Double {
get {
return _quantity / 1000
}
set {
_quantity = newValue * 1000
}
}
override static func primaryKey() -> String? {
return "name"
}
override static func ignoredProperties() -> [String] {
return ["quantity"]
}
}
请注意 Object
的默认 description
不包含被忽略的属性,因此要打印它,您需要覆盖它:
override var description: String {
return "RMovements {\n name = \(name);\n _quantity = \(_quantity);\n quantity = \(quantity);\n}"
}
然后,如果我运行您的示例,我将获得以下日志:
created
check: RMovements {
name = john;
_quantity = 2000.0;
quantity = 2.0;
}
before update: RMovements {
name = john;
_quantity = 2000.0;
quantity = 2.0;
}
after update: RMovements {
name = john;
_quantity = 9000.0;
quantity = 9.0;
}
check: RMovements {
name = john;
_quantity = 9000.0;
quantity = 9.0;
}
关于ios - 具有 getter/setter 的 Realm 对象属性总是返回第一个存储值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39104632/