Android Room Entity使用Enum字段导致构建失败如何解决?
问题原因
- 报错核心是Room生成的Java版Dao实现代码尝试调用
Student类的无参构造器实例化实体,但你当前定义的Student主构造函数需要String、Int、Gender三个参数,没有提供无参构造,所以触发参数不匹配的编译错误。 - 注意:这个问题和Enum类型字段无关,你使用的Room 2.4.0-beta02版本原生支持Enum字段,不需要额外配置TypeConverter。
可行解决方案
方案1:给实体类主构造所有参数添加默认值(最常用)
Kotlin会为所有参数都有默认值的主构造自动生成无参构造,满足Room的实例化要求,修改后的Student代码如下:
@Entity(tableName = "student") data class Student( var name: String = "", var age: Int = 0, var gender: Gender = Gender.UNKNOWN ) { @PrimaryKey(autoGenerate = true) var id: Long = 0 }
你也可以把主键放进主构造简化代码:
@Entity(tableName = "student") data class Student( @PrimaryKey(autoGenerate = true) var id: Long = 0, var name: String = "", var age: Int = 0, var gender: Gender = Gender.UNKNOWN )
方案2:开启Room Kotlin代码生成(无需修改实体类)
如果你不想给字段加默认值,可以开启Room的Kotlin代码生成开关,Room会生成Kotlin版的Dao实现,直接调用你现有的带参主构造实例化实体,无需无参构造。
在模块级build.gradle的android.defaultConfig块中添加如下配置:
android { defaultConfig { // 保留原有其他配置 javaCompileOptions { annotationProcessorOptions { arguments["room.generateKotlin"] = "true" } } } }
配置完成后清理项目重新编译即可,原有Student代码无需任何修改。
内容的提问来源于stack exchange,提问作者Sam Chen
相关产品推荐
相关产品推荐

