You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Room框架中如何实现“一对一关联一对多”关系?

在Room中实现一对一嵌套关联(Appointment → Diagnostic → Description/Survey)

Room完全支持这种嵌套层级的关联关系,不需要修改你现有的数据库表结构,直接通过嵌套@Relation注解的数据类就能实现需求。

实现方案

你已经有了AppointmentWithDiagnostic和DiagnosticWithDescriptionAndSurvey两个关联数据类,只需要把它们嵌套整合,创建一个顶层的数据类即可:

data class AppointmentWithFullDiagnostic(
    @Embedded
    val appointment: Appointment,

    @Relation(
        parentColumn = "idDossier",
        entityColumn = "appointmentId"
    )
    val diagnosticWithDetails: DiagnosticWithDescriptionAndSurvey
)

DAO查询实现

在DAO中添加带@Transaction注解的查询方法,Room会自动处理嵌套关联的查询逻辑:

@Dao
interface AppointmentDao {
    @Transaction
    @Query("SELECT * FROM Appointment")
    fun getAppointmentsWithFullDiagnostic(): List<AppointmentWithFullDiagnostic>

    // 也支持按条件查询单个数据
    @Transaction
    @Query("SELECT * FROM Appointment WHERE idDossier = :appointmentId")
    fun getAppointmentWithFullDiagnostic(appointmentId: Long): AppointmentWithFullDiagnostic?
}

扩展说明

  • 如果后续关系发生变化(比如Diagnostic和Description/Survey变成一对多),只需把DiagnosticWithDescriptionAndSurvey中的description和survey字段改成List<Description>、List<Survey>,Room同样能自动处理嵌套的一对多关联。
  • 你考虑的直接关联所有表或让Survey/Description直接关联Appointment的方案并非必要,嵌套关联更贴合数据库的层级关系,代码可读性和维护性更好,也能避免冗余外键字段。

内容的提问来源于stack exchange,提问作者YohDono

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:01:40