我正在尝试将一些 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/