Android Room实现多级一对多关联时编译构建报错如何解决?
问题原因及解决方案
Room本身完全支持多层嵌套的级联查询场景,你的报错是配置问题导致,和框架能力无关。
报错根因
- 第一个报错:Room生成的DAO实现类需要先实例化关联数据类对象,再填充属性,但你定义的
EAreteSheetWithParagraph、EAreteSheetParagraphWithForm两个数据类没有无参构造,无法直接实例化。 - 第二个报错:数据类的属性声明为
val,编译后没有公开的setter方法,生成的Java代码无法直接给私有属性赋值。 - 隐藏问题:当
@Relation注解的返回值不是直接的实体类,而是另一个包含实体的关联POJO时,必须显式指定entity参数指明对应的实体类,否则Room无法解析映射关系。
修复方案
1. 给关联数据类添加属性默认值
给两个关联类的所有属性添加默认值,让Kotlin自动生成无参构造,兼容Room的实例化逻辑:
data class EAreteSheetWithParagraph( @Embedded val sheet: EAreteSheet = EAreteSheet(0, Sheets(), 0), @Relation( parentColumn = "id", entityColumn = "arete_sheet_id", entity = EAreteSheetParagraph::class // 显式指定对应实体 ) val paragraph: List<EAreteSheetParagraphWithForm> = emptyList() ) data class EAreteSheetParagraphWithForm( @Embedded val paragraph: EAreteSheetParagraph = EAreteSheetParagraph(0, 0, ""), @Relation( parentColumn = "id", entityColumn = "arete_sheet_paragraph_id", entity = EAreteSheetForm::class // 显式指定对应实体 ) val forms: List<EAreteSheetForm> = emptyList() )
可选方案:使用noArg插件
如果你不想给实体写默认值,也可以引入Kotlin的noarg插件,给两个关联类添加无参构造注解,同样可以解决实例化问题。
验证
修改完成后重新构建项目,即可正常编译,多层级联查询可以正常返回结果,该场景已经被大量开发者在生产环境验证可行。
内容的提问来源于stack exchange,提问作者BarbaPaule97
相关产品推荐
相关产品推荐

