我正在尝试将一些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实体的注释或其他命名方案?
答案 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();