Room配置TypeConverter后仍无法将Cursor转为Map<Int,IntArray>如何解决
Room单字段返回Map<Int, IntArray>报错解决方案
报错原因
Room 的 TypeConverter 默认仅作用于实体类的全量持久化、全量读取场景,当你在 DAO 中声明直接返回单个自定义类型的字段值时,Room 不会自动触发注册的转换器,对查询到的原始 String 类型的 scoreList 做转换,因此抛出无法转换 Cursor 到返回类型的错误。
可行解决方案
方案1:查询全量实体类后取字段(最推荐)
不需要修改现有转换器、数据库配置,直接调整DAO方法返回全量实体,调用时再取目标字段即可:
@Dao interface DataDao { // 改成查询整行实体 @Query("SELECT * FROM StartGame WHERE gameId=:gameId") fun getGameById(gameId: Int): StartGame? } // 业务调用处直接取字段 val scoreList = dataDao.getGameById(gameId)?.scoreList ?: emptyMap()
方案2:先查询原始字符串,手动调用转换器转换
如果不想查询多余字段,可以先声明DAO返回数据库存储的原始String值,手动调用转换器做转换:
@Dao interface DataDao { // 先查原始存储的字符串 @Query("SELECT scoreList FROM StartGame WHERE gameId=:gameId") fun getGameScoreRawById(gameId: Int): String? } // 封装转换逻辑 fun getGameScoreById(gameId: Int): Map<Int, IntArray> { val rawValue = dataDao.getGameScoreRawById(gameId) ?: return emptyMap() return MapConverters().fromString(rawValue) }
额外检查项
可以本地测试现有转换器的正确性,避免后续运行时反序列化失败:
// 测试用例 val testMap = mapOf(1 to intArrayOf(10,20), 2 to intArrayOf(30,40)) val converter = MapConverters() val jsonStr = converter.fromMap(testMap) val restoreMap = converter.fromString(jsonStr) // 验证restoreMap的值和testMap一致即可
内容的提问来源于stack exchange,提问作者WONDDAK
相关产品推荐
相关产品推荐

