Room Kotlin报错:实体/POJO需可用构造器及@Relation字段问题
嘿,我来帮你搞定这个Room的报错问题!你遇到的error: Fields annotated with @Relation cannot be constructor parameters. These values are fetched after the object is constructed.错误,原因很明确:Room的@Relation字段是在对象构造完成后,通过额外查询填充的,不能把它放在主构造函数里作为必填参数。
接下来给你具体的修复方案,分几步来:
1. 调整TaskModel的结构
把@Relation标注的subTaskTable从主构造参数中移出来,或者给它设置一个默认值,让Room能在构造对象后再给它赋值。推荐两种写法:
写法一:将@Relation字段放在类体中
class TaskModel( @Embedded var taskTable: TaskTable ) { // 设置默认空列表,Room会后续填充真实的子任务数据 @Relation(parentColumn = "id", entityColumn = "taskId") var subTaskTable: List<SubTaskTable> = emptyList() }
写法二:给@Relation字段设置默认值(保留在主构造)
class TaskModel( @Embedded var taskTable: TaskTable, @Relation(parentColumn = "id", entityColumn = "taskId") var subTaskTable: List<SubTaskTable> = emptyList() )
这两种写法都能让Room正确处理关联数据的填充,因为现在subTaskTable不再是构造时必须传入的参数了。
2. 升级Room版本(关键)
你当前使用的Room版本是1.1.0,这是非常老旧的版本(属于Android Architecture Components时期,现在已经全面迁移到AndroidX),很多早期的bug和限制已经在新版本中被修复。建议升级到稳定的AndroidX版本:
修改Module级build.gradle中的Room配置:
def room_version = "2.5.0" // 可根据需求选择更高的稳定版,比如2.6.1 implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compiler:$room_version" testImplementation "androidx.room:room-testing:$room_version"
注意要把原来的android.arch.persistence.room替换成androidx.room,Google已经停止维护旧的arch包,全面转向AndroidX生态。
3. 确认kotlin-kapt插件正确应用
确保你的Module级build.gradle的plugins块中已经包含kotlin-kapt:
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' // 必须添加这个插件,Room的注解处理器才能正常工作 }
完成以上修改后,重新构建项目,这个错误应该就会消失了。你的Dao层代码不需要修改,Room会自动执行关联查询,把对应的子任务列表填充到TaskModel中。
内容的提问来源于stack exchange,提问作者Shudipto Trafder

