Kotlin Android Room报错无法从Cursor读取ArrayList<Data>字段如何解决?
Room自定义列表字段读写报错解决方案
问题根源:Room 默认仅支持存储基础数据类型(Int、String、Double等),你定义的images字段是ArrayList<Data>自定义对象集合,Room无法直接序列化/反序列化该类型,所以抛出读写报错。第二个报错是DAO层参数类型不符合要求导致。
步骤1:添加Gson依赖
在模块级build.gradle的dependencies块中添加Gson依赖,用于对象和JSON字符串的互转:
implementation 'com.google.code.gson:gson:2.10.1'
步骤2:实现Type Converter转换器类
新建转换器类,定义两种类型互转的方法,每个方法添加@TypeConverter注解:
import androidx.room.TypeConverter import com.google.gson.Gson import com.google.gson.reflect.TypeToken class Converters { // ArrayList<Data> 转 JSON字符串 用于存储 @TypeConverter fun fromDataList(list: ArrayList<Data>): String { return Gson().toJson(list) } // JSON字符串 转 ArrayList<Data> 用于读取 @TypeConverter fun toDataList(json: String): ArrayList<Data> { val type = object : TypeToken<ArrayList<Data>>() {}.type return Gson().fromJson(json, type) } }
步骤3:注册转换器到Room数据库
在你定义的继承自RoomDatabase的类上添加@TypeConverters注解,注册刚才写的转换器:
import androidx.room.Database import androidx.room.RoomDatabase import androidx.room.TypeConverters @Database(entities = [PostModel::class], version = 1) @TypeConverters(Converters::class) // 注册转换器 abstract class AppDatabase : RoomDatabase() { // 定义你的DAO抽象方法 abstract fun productDao(): ProductDao }
步骤4:修复DAO参数报错
第二个报错是因为你在DAO层的方法中传入了Retrofit的Call类型作为参数,DAO方法仅支持接收@Entity注解的类或其集合作为参数,你需要先在网络请求层解析Retrofit返回的结果拿到List<PostModel>后,再传入DAO的插入方法,DAO的插入方法示例:
import androidx.room.Dao import androidx.room.Insert @Dao interface ProductDao { @Insert suspend fun insertAllProducts(products: List<PostModel>) }
内容的提问来源于stack exchange,提问作者ali masarra
相关产品推荐
相关产品推荐

