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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:09:00