java - Android Room 实体 boolean 值与 DAO : Kotlin vs Java

标签 java android kotlin android-room

我正在尝试将一些 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 实体中遗漏了一些东西,例如注释或不同的命名方案?

最佳答案

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

关于java - Android Room 实体 boolean 值与 DAO : Kotlin vs Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52681079/

相关文章:

android - RXJava - 缓冲 observable 1 直到 observable 2 发出一个项目

kotlin - kotlin “when”的 “startWith”出现编译错误

android - 现在必须显式声明 Kapt 注释处理器

java - jackson 通过改变大小写映射到 json

java - 使用 BufferedWriter 方法将联系人从文件导入到地址簿 GUI

java - JFace 给 SWT 添加了什么?

Android Kotlin 底部导航栏

java - 如何交换两个节点及其在单链表中的内容?

android - 在我签名的 apk 中没有显示谷歌地图,需要一步一步的过程

android - Kotlin Android - 通知不显示为抬头