如何编写Room的DAO查询返回以name为键的Map<String, Address>数据?
用Room DAO返回指定字段为键的Map结果
场景说明
现有数据表MyTable,字段包括id、name、city、street、zipcode,对应的数据类定义如下:
data class Address( val city: String, val street: String, val zipcode: String )
想要通过Room DAO查询返回一个Map<String, Address>,其中键是表中的name字段,值是对应行转成的Address对象。直接写普通的SELECT查询无法实现这个需求,最初的DAO方法定义如下:
@Query("SELECT ... FROM MyTable .... WHERE id = :id") suspend fun getAddress(id: Long): Map<String, Address>
可行方案
使用Room提供的@MapColumn注解,明确指定Map的键对应的数据库列名,修改后的DAO方法如下:
@Query("SELECT name, city, street, zipcode FROM MyTable WHERE id = :id") suspend fun getAddress(id: Long): Map<@MapColumn(columnName = "name") String, Address>
关键要点
- 查询语句必须包含
name字段(作为Map的键),以及Address类对应的所有字段(city、street、zipcode),否则Room无法完成正确映射 - 需要确保导入
androidx.room.MapColumn注解类
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

