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

Android Room已创建Type Converter仍报字段存储错误,求排查

Room数据库报错:Cannot figure out how to save this field into database 原因分析及解决

我定义了两个Entity类FoodDonation和DonatedObject,其中FoodDonation包含ArrayList<DonatedObject>类型的donatedObjects字段。我已创建DonatedObjectConverter,并在FoodDonation类、该字段以及Database类上添加了@TypeConverters(DonatedObjectConverter::class)注解,但仍出现“Cannot figure out how to save this field into database”错误,请问原因是什么?

相关代码

FoodDonation类

@Entity
@TypeConverters(DonatedObjectConverter::class)
data class FoodDonation(@PrimaryKey val id:String,
                        ...
                        @TypeConverters(DonatedObjectConverter::class)
                        var donatedObjects : ArrayList<DonatedObject>
                        ){
    @Ignore
    constructor():this("","",0,"","", ArrayList())
}

DonatedObject类

@Entity
data class DonatedObject(@PrimaryKey
                         val foodId: String,
                         val donatedAmount: Int)
                         {
    @Ignore
    constructor():this("",0)
}

Type Converter类

class DonatedObjectConverter {
    @TypeConverter
    fun fromArray(foodDonationList:ArrayList<FoodDonation>?): String?  {
        return Gson().toJson(foodDonationList)
    }

    @TypeConverter
    fun toArray(value:String?):ArrayList<FoodDonation>? {
        val listType: Type = object : TypeToken<ArrayList<FoodDonation>>() {}.type

        return Gson().fromJson(value, listType)
    }
}

Database类

@Database(entities = [FoodDonation::class], version = 1, exportSchema = false)
@TypeConverters(DonatedObjectConverter::class)
abstract class FoodDonationDatabase:RoomDatabase() {
    abstract fun foodDonationDao():FoodDonationDao 
    ...
    ...
}

报错原因

核心问题是TypeConverter的类型完全不匹配:

  • 你需要转换的是ArrayList<DonatedObject>类型的字段,但写的转换器处理的却是ArrayList<FoodDonation>类型。Room找不到能处理ArrayList<DonatedObject>的转换器,因此抛出无法保存字段的错误。

解决方法

修正DonatedObjectConverter的类型,让它对应实际需要转换的DonatedObject列表:

class DonatedObjectConverter {
    @TypeConverter
    fun fromDonatedObjectList(list: ArrayList<DonatedObject>?): String? {
        return Gson().toJson(list)
    }

    @TypeConverter
    fun toDonatedObjectList(value: String?): ArrayList<DonatedObject>? {
        val listType: Type = object : TypeToken<ArrayList<DonatedObject>>() {}.type
        return Gson().fromJson(value, listType)
    }
}

额外提示:

  • 不需要在多个地方重复添加@TypeConverters注解,只需要在FoodDonationDatabase类或者FoodDonation类上添加一次即可,重复添加无意义。
  • 注意DonatedObject本身被标记为@Entity,如果你的需求是建立FoodDonation和DonatedObject的一对多关联,更规范的做法是使用Room的@ForeignKey和关联查询,而不是将列表序列化为JSON字符串存储。如果确实需要JSON存储的方式,修正转换器类型即可解决当前报错。

内容的提问来源于stack exchange,提问作者TENG FUNG ENG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:15:39