Room存储之复杂数据存储(List)

阅读建议:此篇文章基于room的简单使用,如果你还没使用过room存储,可以先阅读官方文档

假设存在如下一个Bean

class RoomTest {

    var id: String=""
    var list: List? = 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? = 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 {
    val listType = object : TypeToken>() {}.type
    return Gson().fromJson(value, listType)
}

@TypeConverter
fun objectToString(list: List): String {
    return Gson().toJson(list)
}
}

在bean添加转换器注解,指定对应的转换器,如下:

@Entity(tableName = "room_test")
@TypeConverters(RoomTestConverters::class)
class RoomTest {

@PrimaryKey
var id: String=""
var list: List? = null

class TestBean(
    var id: String,
    var name: String
)

}

就可以正常进行数据存储操作了。Room对于List存储,给出的方案实际上就是讲list听过类型转换在存的时候通过GSON转换为String类型进行存储,在取的时候再转换为对应的bean。

你可能感兴趣的:(Room存储之复杂数据存储(List))