Room数据库自定义Syllables对象的TypeConverter实现问题
错误原因
你当前的Syllables相关TypeConverter错误原因出在反序列化方法的返回值类型不匹配:Word实体中的syllables字段是单个Syllables?类型,而你写的toSyllables方法把JSON反序列化为Syllables数组再转列表,返回的是List<Syllables>类型,和字段类型不匹配,因此无法生效。
正确的Converter实现
class Converters { @TypeConverter fun stringListToJson(value: List<String>?) = Gson().toJson(value) @TypeConverter fun jsonToStringList(value: String) = Gson().fromJson(value, Array<String>::class.java).toList() // Syllables转JSON字符串,存储到数据库 @TypeConverter fun fromSyllables(value: Syllables?) = Gson().toJson(value) // JSON字符串转回单个Syllables对象,匹配实体类字段类型 @TypeConverter fun toSyllables(value: String) = Gson().fromJson(value, Syllables::class.java) }
额外注意事项
- 必须将该Converter类添加到你的Room数据库类的
@TypeConverters注解中才能生效,示例如下:
@Database(entities = [Word::class], version = 1) @TypeConverters(Converters::class) abstract class WordDatabase : RoomDatabase() { // 此处定义你的DAO }
- 不需要为Syllables内部的
count:Int?和list:List<String>?字段单独写转换器,Gson会自动复用已定义的List<String>转换逻辑完成嵌套字段的序列化/反序列化。
内容的提问来源于stack exchange,提问作者Shahzad Ansari
相关产品推荐
相关产品推荐

