ios - 具有 getter/setter 的 Realm 对象属性总是返回第一个存储值

标签 ios swift realm

我有一个 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/

相关文章:

ios - 调用了 prepareForSegue 但未加载下一个 UIViewController

ios - SDWebImage - SDWebImagePrefetcher 不使用transformDownloadedImage

android - 使用存储库模式捕获 MVP 中的响应返回

ios - 如何使用 Realm 确定一对一关系的反向关系?

ios - 自定义推送通知的 iOS 权限对话框

android - 用于移动应用的 NoSQL?

ios - 如何搜索多个项目或搜索而不考虑 UISearchBar 的位置

ios - Firebase 覆盖现有记录

ios - 使用 HTTP header 参数发布请求

android - 将关系从改造保存到 Realm 。