Android 使用 DAO 的房间实体布尔值:Kotlin 与 Java

Android Room Entity boolean with DAO: Kotlin vs Java

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

根据 Defining data using Room entities 的文档,getter 和 setter 将按照 JavaBean 约定命名。

If you use getter and setter methods, keep in mind that they're based on JavaBeans conventions in Room.

有了JavaBeans和一个boolean字段,在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 时,出现编译时错误

error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such column: enabled)

这似乎是 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 实体的某些内容,例如注释或不同的命名方案?

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

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

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

检查生成的字节码后,此 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();