Android Room双表查询返回重复数据及编译报错问题求助
问题原因说明
- 方案2编译报错原因
你定义的TaskWithProject关联逻辑写反了:当前你将Project作为@Embedded主体,@Relation配置的是「根据Project的id关联对应Task」,这个结构对应「查询Project+该项目下所有Task」的需求。但你方案2的查询语句是查Task表,Room无法将Task表的查询结果映射到以Project为主体的POJO上,因此抛出Cursor转换失败的错误。 - 方案1数据重复原因
你同时使用了手动JOIN语句和@Relation注解:Room解析你手动JOIN返回的结果后,还会按照@Relation的配置额外执行一次关联查询,两次查询叠加导致了数据重复。
解决方案
方案A:使用Room自动关联(推荐)
修正TaskWithProject的结构,以Task为主体关联对应的Project:
public class TaskWithProject { @Embedded public Task task; @Relation(parentColumn = "projectId", entityColumn = "id") public Project project; }
Dao层直接保留方案2的写法即可,无需手动写JOIN:
@Transaction @Query("SELECT * FROM Task") LiveData<List<TaskWithProject>> getTaskWithProject();
方案B:使用手动JOIN映射
如果不想使用@Relation自动关联,就去掉POJO中的@Relation注解,为避免字段重名添加前缀:
public class TaskWithProject { @Embedded public Task task; @Embedded(prefix = "project_") public Project project; }
Dao层的查询语句给Project字段加对应前缀别名:
@Query("SELECT t.*, p.id AS project_id, p.name AS project_name, p.color AS project_color FROM Task t JOIN Project p ON t.projectId = p.id") LiveData<List<TaskWithProject>> getTaskWithProject();
内容的提问来源于stack exchange,提问作者Emmcy
相关产品推荐
相关产品推荐

