如何获取列表项并存入Room数据库?Type转换器报错求助
看起来你遇到的核心问题是TypeConverter的类型和实体类中字段的类型不匹配,导致Room不知道如何将Results?类型的数据存入数据库。我来一步步帮你解决:
问题分析
你的Subscriber实体里,name和confidence字段都是Results?类型,但你写的TypeConverter是用来处理List<String?>的——这完全是两种不同的类型,Room自然无法识别,所以才会抛出那个错误。
解决方案步骤
1. 编写针对Results类型的TypeConverter
你需要为Results这个自定义类专门写转换器,用Gson把它序列化为JSON字符串,或者从JSON字符串反序列化为Results对象:
class ResultsTypeConverter { // 将Results对象转成JSON字符串 @TypeConverter fun resultsToJson(results: Results?): String? { return results?.let { Gson().toJson(it) } } // 将JSON字符串转回Results对象 @TypeConverter fun jsonToResults(jsonString: String?): Results? { return jsonString?.let { Gson().fromJson(it, Results::class.java) } } }
如果你的需求是存储**Results的列表**(比如List<Results>?),那转换器要改成这样:
class ResultsListTypeConverter { @TypeConverter fun resultsListToJson(resultsList: List<Results>?): String? { return resultsList?.let { Gson().toJson(it, object : TypeToken<List<Results>>() {}.type) } } @TypeConverter fun jsonToResultsList(jsonString: String?): List<Results>? { return jsonString?.let { Gson().fromJson(it, object : TypeToken<List<Results>>() {}.type) } } }
2. 在Room数据库类上注册转换器
写完转换器后,必须让Room知道它的存在。找到你的Room Database类,加上@TypeConverters注解:
@Database(entities = [Subscriber::class], version = 1) // 注册你刚才写的转换器类,多个的话用逗号分隔 @TypeConverters(ResultsTypeConverter::class) abstract class AppDatabase : RoomDatabase() { abstract fun subscriberDao(): SubscriberDao }
3. 检查实体类字段的合理性(可选但建议)
注意到你的实体字段命名有点奇怪:name字段存Results?,confidence字段也存Results?,而且detected_time对应的变量名是confidence——这大概率是笔误吧?比如confidence应该是置信度(Float/Double类型),detected_time应该是时间戳(Long类型)?如果是这样,建议修正实体类,避免逻辑混淆:
@Entity(tableName = "objects_table") data class Subscriber( @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "object_id") var id: Int = 0, // 建议给主键默认值,方便插入 @ColumnInfo(name = "object_name") var name: String?, @ColumnInfo(name = "detected_confidence") var confidence: Float?, @ColumnInfo(name = "detected_time") var detectedTime: Long?, // 如果确实需要存Results对象 @ColumnInfo(name = "object_result") var result: Results? )
最后验证
做完以上步骤后,重新编译项目,Room就能正确处理Results类型的字段了。如果还是有问题,检查一下Results类是否是可序列化的(比如确保类的字段都是公开的或者有getter方法,Gson不需要强制加序列化注解,但无参构造函数会让反序列化更顺畅)。
内容的提问来源于stack exchange,提问作者Nephes Dr

