我正在为一个演出发布应用程序构建一个数据存储。用户可以将职位发布到求职板上,然后多人可以申请,也可以雇用多人。这些工作被分解成海报。所以每个工作都有一个工人列表和一个海报列表。
我遇到的问题是我的带有列表的房间对象一次只能返回一个列表。例如 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>
假设您指的是 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 个列表