境界呼唤二传手

时间:2017-03-28 10:06:02

标签: realm kotlin

我使用realm作为数据库,使用kotlin作为语言 我为属性实现了自定义setter方法。

Realm是否以某种方式调用此setter?

例如:

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

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

但是,如果Realm也调用了这个方法,我就无法做到这一点。

由于

1 个答案:

答案 0 :(得分:1)

我用Kotlin 1.1.1和Realm 3.0.0尝试了这个,它没有调用自定义setter,它以其他方式分配值(这意味着它甚至可以在你的自定义setter为空时工作,这有点出乎意料)。

编辑:查看生成的代码和调试程序。

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

类似地,调用setter最终会获得本机调用以设置适当的值。这解释了为什么setter不被调用:Realm不需要调用setter,因为它不会急切地将值加载到内存中,代理只是指向Realm中的真实数据,并且每当你读到它时价值,它将从那里读取。

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

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
    }