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
相关产品推荐
相关产品推荐

