如何创建带多列表(一对多+多对多)的Android Room DAO
解决Room同时获取Job关联的Workers和Posters的问题
要实现同时返回包含Workers和Posters列表的Job对象,只需创建一个整合型数据类,通过多个@Relation注解分别关联Workers和Posters实体即可,具体步骤如下:
1. 创建整合数据类JobWithWorkersAndPosters
基于现有实体,嵌入Job并添加两个@Relation字段,分别对应Workers和Posters列表:
data class JobWithWorkersAndPosters( @Embedded val job: Job, // 通过交叉表关联Workers @Relation( parentColumn = "job_id", entityColumn = "worker_id", associateBy = Junction(JobWorkerCrossRef::class) ) val workers: List<Worker>, // 直接通过job_id关联Posters @Relation( parentColumn = "job_id", entityColumn = "job_id" ) val posters: List<Poster> )
2. 在DAO中添加对应查询方法
在JobDao接口里新增带@Transaction注解的查询方法,获取整合后的Job数据:
interface JobDao { // ... 原有方法保持不变 ... @Transaction @Query("SELECT * FROM job WHERE job_id = :jobId") suspend fun getJobWithWorkersAndPosters(jobId: Int): JobWithWorkersAndPosters? // 如需获取所有Job的整合数据,可添加: @Transaction @Query("SELECT * FROM job") suspend fun getAllJobsWithWorkersAndPosters(): List<JobWithWorkersAndPosters> }
关键说明
@Embedded将Job实体的字段直接映射到该数据类中- 两个
@Relation分别处理不同关联逻辑:Workers通过交叉表JobWorkerCrossRef实现多对多关联,Posters通过job_id实现一对多关联 - 必须添加
@Transaction注解,确保Room在单次事务中完成主表与关联表的查询,保证数据一致性
内容的提问来源于stack exchange,提问作者user1743524
相关产品推荐
相关产品推荐

