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
相关产品推荐
相关产品推荐

