Room数据库多表查询返回自定义POJO报游标字段读取错误的解决方法
问题原因
Room默认无法自动将查询返回的零散列,组装成自定义POJO中嵌套的实体类对象。你当前查询返回的是favorite.*展开的所有单独字段、外加cartQuantity字段,Room找不到和Favorite favorite字段直接匹配的单列值,因此抛出无法从Cursor读取该字段的错误。
修复方案
不需要修改你已经写好的SQL查询逻辑,只需要调整FavoriteAdapterData类的字段注解即可,使用Room提供的@Embedded注解标记嵌套的实体字段,告诉Room将查询结果中匹配的列自动映射到嵌套对象的对应属性上:
public class FavoriteAdapterData { int cartQuantity = 0; @Embedded Favorite favorite; // 其余原有 getter/setter 等代码保持不变 }
注意:如果后续你的关联查询出现列名重名的情况,可以给
@Embedded添加prefix参数指定列前缀,再在SQL查询时给对应列加别名匹配前缀即可,当前查询无重名问题,直接添加注解即可正常运行。
如果你不想用注解,也可以选择把Favorite类的所有字段直接平铺定义在FavoriteAdapterData类中,移除单独的Favorite favorite字段,这种方式不需要额外注解,但后续Favorite实体修改字段时需要同步修改该类,维护成本更高,不推荐使用。
修改完成后重新编译项目,原有Dao层的查询代码不需要调整,就能正常完成结果映射。
内容的提问来源于stack exchange,提问作者Aiman Alyosofi
相关产品推荐
相关产品推荐

