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

Room报错:无法存储City字段,配置Type Converter后仍无效

解决Room数据库「Cannot figure out how to save this field into database」报错

你的问题出在Type Converter的注解使用错误,以及字段注解的误用,具体修正步骤如下:

1. 修正CityConverter类的注解错误

你的stringToCity方法误用了@TypeConverters(复数)注解,正确应该使用@TypeConverter(单数),这是Room识别转换方法的核心标记:

class CityConverter {

    private val jsonAdapter = Moshi.Builder()
        .addLast(KotlinJsonAdapterFactory())
        .build()
        .adapter(City::class.java)

    @TypeConverter
    fun cityToString(city: City?): String {
        return city?.let { jsonAdapter.toJson(it) } ?: ""
    }

    // 把@TypeConverters改为@TypeConverter
    @TypeConverter
    fun stringToCity(json: String?): City? {
        return json?.takeIf { it.isNotEmpty() }?.let { jsonAdapter.fromJson(it) }
    }
}

额外建议给stringToCity添加非空字符串判断,避免空字符串转换City时出现解析异常。

2. 移除实体类字段上的错误注解

你曾尝试在city字段上添加@TypeConverter(CityConverter::class),这是错误用法——@TypeConverter是标记转换方法的注解,字段上若要指定转换器需用@TypeConverters(复数),但你已经在Database类上全局添加了@TypeConverters(CityConverter::class),完全不需要在字段上重复配置,直接保留字段定义即可:

@Entity(tableName = "users")
data class UserEntity(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    val name: String,
    val city: City?
)

3. 确认依赖配置完整

确保Gradle依赖中包含Room和Moshi的必要配置,示例如下:

// Room相关
implementation "androidx.room:room-runtime:2.6.1"
kapt "androidx.room:room-compiler:2.6.1"
implementation "androidx.room:room-ktx:2.6.1"

// Moshi相关
implementation "com.squareup.moshi:moshi:1.15.0"
kapt "com.squareup.moshi:moshi-kotlin-codegen:1.15.0"

完成以上修改后,clean并重新编译项目,Room就能正确识别City类型的转换逻辑,报错即可解决。

内容的提问来源于stack exchange,提问作者Илья Жиленков

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:47:12