android - 如何为列表编写类型转换器房间内数据库
问题描述
我有两个实体“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
}
解决方案
为您的用例编写转换器的正确方法是
@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) }
推荐阅读
- python - 如何从这些数字中获取日期
- javascript - 输入类型文件只接受一种类型的应用程序,没有 allFiles 选项
- r - 在 R 中的 X 轴上显示标签
- typescript - 为什么使这个变量可以为空会在 VSCode 中产生 linting 错误?
- mysql - Mysql 检查两个表的值是否包含在另一个表的数组中
- c# - 不允许新事务,因为会话 ASP.Net MVC 中正在运行其他线程
- javascript - 用整数和字符串分隔数组
- mysql - 在特定字符后拆分 SQL 中的值
- ruby-on-rails - 如何提取 Rails 枚举的字段并获取整数数组?
- android - android中的u0_aXXX和u0_aXXX_cache有什么区别?