我有两个实体'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
}
答案 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) }