阅读建议:此篇文章基于room的简单使用,如果你还没使用过room存储,可以先阅读官方文档
假设存在如下一个Bean
class RoomTest {
var id: String=""
var list: List<TestBean>? = null
inner class TestBean(
var id: String,
var name: String
)
}
使用Room存储改造的Bean
@Entity(tableName = "room_test")
class RoomTest {
@PrimaryKey
var id: String=""
var list: List<TestBean>? = null
inner class TestBean(
var id: String,
var name: String
)
}
上面的代码直接使用room存储在编译期间就会直接报错:
Cannot figure out how to save this field into database. You can consider adding a type converter for it.
提示需要添加一个类型转换器。
创建如下类型转换器:
class RoomTestConverters {
@TypeConverter
fun stringToObject(value: String): List<RoomTest.TestBean> {
val listType = object : TypeToken<List<RoomTest.TestBean>>() {}.type
return Gson().fromJson(value, listType)
}
@TypeConverter
fun objectToString(list: List<RoomTest.TestBean>): String {
return Gson().toJson(list)
}
}
在bean添加转换器注解,指定对应的转换器,如下:
@Entity(tableName = "room_test")
@TypeConverters(RoomTestConverters::class)
class RoomTest {
@PrimaryKey
var id: String=""
var list: List<TestBean>? = null
class TestBean(
var id: String,
var name: String
)
}
就可以正常进行数据存储操作了。Room对于List存储,给出的方案实际上就是讲list听过类型转换在存的时候通过GSON转换为String类型进行存储,在取的时候再转换为对应的bean。