如何使用多个单独的列表(一对多和多对多)创建 Android Room Dao

问题描述 投票:0回答:1

我正在为一个演出发布应用程序构建一个数据存储。用户可以将职位发布到求职板上,然后多人可以申请,也可以雇用多人。这些工作被分解成海报。所以每个工作都有一个工人列表和一个海报列表。

我遇到的问题是我的带有列表的房间对象一次只能返回一个列表。例如 JobsWithWorkers 或 JobsWithPosters。真的,我需要像 JobsWithWorkersAndTasks 这样的东西。

这是我的实体关系

Job 
@Entity
data class Job (
    @PrimaryKey val job_id: Int,
    val status: Int,
    val owner_id: Int)
data class JobWithWorkers (
    @Embedded val job: Job,
    @Relation(
        parentColumn = "job_id",
        entityColumn = "worker_id",
        associateBy = Junction(JobWorkerCrossRef::class)
    )
    val workers: List<Worker>
)
data class JobsWithPosters (
    @Embedded val job: Job,
    @Relation(
        parentColumn = "job_id",
        entityColumn = "job_id"
    )

    val posters: List<Poster>
)

这是我的 DAO 接口。我需要创建一个方法来检索包含工人和海报的工作列表

interface JobDao {

    @Query("SELECT * FROM job")
    fun getJobs(): Flow<List<Job>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertOwner(owner: Owner)

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertJob(job: Job)

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertPoster(poster: Poster)

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertWorker(worker: Worker)

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertJobWorkerCrossRef (crossRef: JobWorkerCrossRef)

    @Transaction
    @Query("SELECT * FROM owner WHERE owner_id = :owner_id")
    suspend fun getOwnerWithJobs(owner_id : Int): List<OwnerWithJobs>

    @Transaction
    @Query("SELECT * FROM job WHERE job_id = :job_id")
    suspend fun getJobsWithPosters(job_id : Int): List<JobsWithPosters>


    @Transaction
    @Query("SELECT * FROM job WHERE job_id = :job_id")
    suspend fun getWorkersOfAJob(job_id: Int ): List<JobWithWorkers>

    @Transaction
    @Query("SELECT * FROM worker WHERE worker_id = :worker_id")
    suspend fun getJobsOfAWorker(worker_id: Int ): List<WorkerWithJobs>
android many-to-many android-room entity dao
1个回答
0
投票

假设您指的是 JobsWithWorkersAndWithPosters

data class JobWithWorkersAndWithPosters (
    @Embedded val job: Job,
    @Relation(
        parentColumn = "job_id",
        entityColumn = "worker_id",
        associateBy = Junction(JobWorkerCrossRef::class)
    )
    val workers: List<Worker>,
    @Relation(
        parentColumn = "job_id",
        entityColumn = "job_id"
    )
    val posters: List<Poster>
)

并演示使用(为简洁起见在主线程上):-

@Transaction
@Query("SELECT * FROM job")
fun getAllJobsWithWorkersAndWithPosters(): List<JobWithWorkersAndWithPosters>

和:-

    db = TheDatabase.getInstance(this)
    dao = db.getJobDao()

    dao.insertJob(Job(1,1,1))
    dao.insertJob(Job(2,2,2))
    dao.insertPoster(Poster(1,1,"P1"))
    dao.insertPoster(Poster(2,1,"P2"))
    dao.insertPoster(Poster(3,1,"P3"))
    dao.insertPoster(Poster(4,2,"P4"))
    dao.insertWorker(Worker(1,"W1"))
    dao.insertWorker(Worker(2,"w2"))
    dao.insertWorker(Worker(3,"W3"))
    dao.insertWorker(Worker(4,"W4"))
    dao.insertJobWorkerCrossRef(JobWorkerCrossRef(1,3))
    dao.insertJobWorkerCrossRef(JobWorkerCrossRef(1,4))
    dao.insertJobWorkerCrossRef(JobWorkerCrossRef(2,1))
    dao.insertJobWorkerCrossRef(JobWorkerCrossRef(2,2))
    dao.insertJobWorkerCrossRef(JobWorkerCrossRef(2,3))
    dao.insertJobWorkerCrossRef(JobWorkerCrossRef(2,4))

    for (jwwawp in dao.getAllJobsWithWorkersAndWithPosters()) {
        val sbw = StringBuilder()
        for (w in jwwawp.workers) {
            sbw.append("\n\tWORKER IS ${w.name} ID is ${w.worker_id}")
        }
        val sbp = StringBuilder()
        for (p in jwwawp.posters) {
            sbp.append("\n\tPOSTER US ${p.name} ID is ${p.poster_id} JOBID is ${p.job_id}")
        }
        Log.d("DBINFO","Job ID ${jwwawp.job.job_id} Status is ${jwwawp.job.status} Owner ID is ${jwwawp.job.job_id}. \nJob has ${jwwawp.posters.size} Posters, they are:- ${sbp}\nJob has ${jwwawp.workers.size} Workers, they are:- ${sbw}")
    }

输出到日志的结果是:-

D/DBINFO: Job ID 1 Status is 1 Owner ID is 1. 
    Job has 3 Posters, they are:- 
        POSTER US P1 ID is 1 JOBID is 1
        POSTER US P2 ID is 2 JOBID is 1
        POSTER US P3 ID is 3 JOBID is 1
    Job has 2 Workers, they are:- 
        WORKER IS W3 ID is 3
        WORKER IS W4 ID is 4
D/DBINFO: Job ID 2 Status is 2 Owner ID is 2. 
    Job has 1 Posters, they are:- 
        POSTER US P4 ID is 4 JOBID is 2
    Job has 4 Workers, they are:- 
        WORKER IS W1 ID is 1
        WORKER IS w2 ID is 2
        WORKER IS W3 ID is 3
        WORKER IS W4 ID is 4

即来自单个查询的 2 个列表

© www.soinside.com 2019 - 2024. All rights reserved.