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

Room一对一关联如何查询Address、City、State组合列表供RecyclerView使用

实现步骤

1. 定义查询结果映射数据类

首先创建一个非@Entity的普通Kotlin数据类,用于接收三表联查的返回结果,字段名要和你SQL语句中定义的列别名保持一致:

data class AddressWithCityState(
    val address: String,
    val city: String,
    val state: String
)

2. 在Dao中添加查询方法

你可以直接在对应的Dao接口里写和需求几乎一致的SQL语句,注意修正原SQL里ADDRES的拼写错误:

@Dao
interface AddressDao {
    // 直接返回列表
    @Query("""
        SELECT 
            ADDRESS.NAME AS address,
            CITY.NAME AS city,
            STATE.NAME AS state
        FROM ADDRESS
        INNER JOIN CITY ON CITY.ID = ADDRESS.CITYFK
        INNER JOIN STATE ON STATE.ID = CITY.STATEFK
    """)
    fun getAddressFullInfo(): List<AddressWithCityState>

    // 如果需要异步响应式获取,也可以返回Flow或者LiveData,如下:
    // fun getAddressFullInfo(): Flow<List<AddressWithCityState>>
    // fun getAddressFullInfo(): LiveData<List<AddressWithCityState>>
}

注意事项

  • Room会自动根据查询返回的列名和你定义的数据类的字段名做映射,不需要额外的注解配置,只要命名一致即可
  • 如果是在主线程调用查询,需要给Room数据库配置allowMainThreadQueries(),否则建议用协程、Flow或者LiveData的形式异步调用,避免阻塞主线程
  • 如果你需要完整的Address、City、State实体字段而非仅三个名称,也可以用@Embedded+@Relation的嵌套关联形式实现,不过对于当前需求,直接联查返回轻量POJO的方式性能更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:24:04