首页 文章

Android Room Entity boolean with DAO:Kotlin vs Java

提问于
浏览
0

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

根据Defining data using Room entities的文档,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();

Defining data using Room entities上没有任何正式的Kotlin示例,我想在更改所有DAO之前确保这是正确的行为 .

这是正确的,还是我错过了与Kotlin实体这样的注释或不同的命名方案?

2 回答

  • 0

    检查生成的字节码后,这个Kotlin代码

    var isEnabled: Boolean
    

    创建以下方法

    public Boolean isEnabled();
    public void setEnabled();
    

    为了在Kotlin中执行此操作并在保留JavaBean约定的同时在DAO中使用它们,查询需要使用 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();
    
  • 0

    嗯,我相信在JavaBeans中为布尔值自动创建“是”getter .

    所以,你应该让你的变量“启用” .

    我怀疑你可以使用isIsEnabled获取现有布尔变量的值 .

相关问题