【问题标题】:Realm call setter领域调用设置器
【发布时间】:2017-03-28 10:06:02
【问题描述】:

我使用领域作为数据库,使用 kotlin 作为语言。
我为一个属性实现了我的自定义设置方法。

Realm 是否以某种方式调用此设置器?

例如:

open class Human(): RealmObject()
{
    open var Name: String = ""
    set(value) 
    {
       setName(value)
    }
}

现在我还有一个属性changeDate,如果我可以在setName中自动将changeDate设置为新的实际日期,那就太好了。

但是如果 Realm 也调用这个方法,我就不能这样做了。

谢谢

【问题讨论】:

    标签: realm kotlin


    【解决方案1】:

    我已经在 Kotlin 1.1.1 和 Realm 3.0.0 上尝试过,它不调用自定义设置器,它以其他方式分配值(这意味着即使您的自定义设置器为空,它也可以工作,有点意外)。

    编辑:查看了生成的代码和调试器。

    当您使用连接到 Realm 的对象时,它是代理类的实例,它是您在代码中使用的类的子类。当您读取此实例的属性时,对 getter 的调用会转到本地调用,以访问 Realm 内部磁盘上的存储值。

    同样,调用 setter 最终会得到本地调用来设置适当的值。这解释了为什么不调用 setter:Realm 不需要调用 setter,因为它不会急切地将值加载到内存中,代理只是指向 Realm 中的真实数据,并且无论何时阅读值,它将从那里读取。

    至于这与 Kotlin 代码的关系,只要您使用 field 关键字(大部分情况下),就会调用代理的 setter 和 getter 来访问 Realm 中的数据。

    var Name: String = ""
        get() {
            return field // this calls `String realmGet$Name()` on the proxy
        }
        set(value) {
            field = value // this calls `void realmSet$Name(String value)` on the proxy
        }
    

    【讨论】:

    • 所以 Realm 永远不会调用 setter?
    • 我相信不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2016-05-13
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多