如何在房间数据库中为List <CustomObject>编写类型转换器

时间:2019-11-15 06:52:57

标签: android kotlin android-room

我有两个实体'tableOne'和'tableTwo'

@Entity(tableName = "tableOne")
data class TableOne(
    @field:Json(name = "id") @PrimaryKey val id: Int,
    @field:Json(name = "image") @ColumnInfo(name = "image") val image: List<Image>?
) {
    constructor() : this(0, null)
}

@Entity(tableName = "tableTwo")
data class TableTwo(
    @field:Json(name = "id") @PrimaryKey val id: Int,
    @field:Json(name = "image") @ColumnInfo(name = "image") val image: List<Image>?
) {
    constructor() : this(0, null)
}

现在我有了“图像”表,该表将具有上述两个表的外键。

@Entity(
tableName = "Image",
foreignKeys = [ForeignKey(
    entity = TableOne::class,
    parentColumns = arrayOf("id"),
    childColumns = arrayOf("parent_id"),
    onDelete = ForeignKey.CASCADE,
    onUpdate = ForeignKey.CASCADE
), ForeignKey(
    entity = TableTwo::class,
    parentColumns = arrayOf("id"),
    childColumns = arrayOf("parent_id"),
    onDelete = ForeignKey.CASCADE,
    onUpdate = ForeignKey.CASCADE
)]
)
data class Image(
    @PrimaryKey
    @ColumnInfo(name = "id") var id: Int = System.currentTimeMillis().toInt(),
    @ColumnInfo(name = "parent_id") val parentId: Int,
    @field:Json(name = "url") @ColumnInfo(name = "url") val url: String?
) {
constructor() : this(0, 0, null)
}

运行应用程序时出现错误。

error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.

我们如何为List编写类型转换器,而不是转换为Json?是这样还是我们需要添加其他内容?

    @TypeConverter
    @JvmStatic
    internal fun fromListOfImages(images: List<Image>): Image? {
        var img: Image? = null
        for (image in images) {
            img = image
        }
        return img
    }

    @TypeConverter
    @JvmStatic
    internal fun toListOfImages(image: Image): List<Image> {
        val images: ArrayList<Image> = ArrayList()
        images.add(image)
        return images
    }

1 个答案:

答案 0 :(得分:1)

为您的用例编写转换器的正确方法是

    @TypeConverter
@JvmStatic
internal fun fromListOfImages(images: List<Image>): String {
    return Gson().toJson(images)
}

@TypeConverter
@JvmStatic
internal fun toListOfImages(image: String): List<Image> {
    val listType = object : TypeToken<List<Image>>() {}.type
    return Gson().fromJson<List<Image>>(image, listType)   }