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

如何获取列表项并存入Room数据库?Type转换器报错求助

解决Room数据库无法保存Results类型字段的问题

看起来你遇到的核心问题是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:52:28