带有 DAO 的 Android Room 实体布尔值:Kotlin 与 Java

我正在尝试将我的一些 Android Java POJO 类迁移到 Kotlin。其中一些类用作房间实体。


根据使用 Room 实体定义数据的文档,getter 和 setter 将在 JavaBean 约定中命名。


如果您使用 getter 和 setter 方法,请记住它们基于 Room 中的 JavaBeans 约定。


有了 JavaBeans 和一个布尔字段,在 Java 中应该是这样的


@Entity

public class MyObject {

    // other stuff

    public MyObject() {

        this.enabled = false;

    }


    public boolean isEnabled() { return this.enabled; }

    public void setEnabled(boolean enabled) { this.enabled = enabled; }

}

现在在 DAO 中,可以这样引用 enabled = 1


@Query("select * from myobject where enabled = 1")

public List<MyObject> loadEnabledObjects();

在 Kotlin 中,对象简化为这个


@Entity

class MyObject {

    // other stuff

    var isEnabled: Boolean = false

}

像以前一样使用 DAO 时,会出现编译时错误


错误:查询有问题:[SQLITE_ERROR] SQL 错误或缺少数据库(没有该列:已启用)


这似乎是 Room 实体在我的 Kotlin 版本中的行为不同,要使用 DAO 引用 Kotlin 版本,我必须更改查询以使用 isEnabled = 1


@Query("select * from myobject where isEnabled = 1")

public List<MyObject> loadEnabledObjects();

没有任何关于使用 Room 实体定义数据的官方 Kotlin 示例,我想在更改所有 DAO 之前确保这是正确的行为。


这是正确的,还是我遗漏了 Kotlin Entity 这样的注释或不同的命名方案?


白衣染霜花
浏览 313回答 2
2回答

慕的地6264312

检查生成的字节码后,这个 Kotlin 代码var isEnabled: Boolean创建以下方法public Boolean isEnabled();public void setEnabled();为了在 Kotlin 中做到这一点并在 DAO 中使用它们同时保持 JavaBean 约定,查询需要使用 isEnabled@Query("select * from myobject where isEnabled = 1")public List<MyObject> loadEnabledObjects();我仍然不确定为什么 DAO 在 Kotlin 下不能使用与 Java 下相同的查询语法,因为它们都具有相同的方法和签名。由于我的代码都依赖于 JavaBean 约定,因此我刚刚更改了查询。只是为了添加注释,我在检查生成的字节码时遇到了这个 Kotlin 代码var enabled: Boolean生成这些方法public Boolean getEnabled();public void setEnabled();

摇曳的蔷薇

嗯,我相信“is”getter 是为 JavaBeans 中的布尔值自动创建的。所以,你应该让你的变量“启用”。我怀疑您可以使用 isIsEnabled 获取现有布尔变量的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java