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

时间:2018-10-06 16:28:11

标签: java android kotlin android-room

我正在尝试将一些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 :(得分:0)

嗯,我相信Java Bean中会自动为布尔值创建“ is”获取器。

因此,您应该仅使变量“启用”。

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

答案 1 :(得分: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();