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,提问作者Илья Жиленков
相关产品推荐
相关产品推荐

