如何解决在 Room DB 中保存多态性抽象类的最佳实践
我有一个抽象类,有很多孩子想在 Room 表中保存为抽象类。
@ColumnInfo(name = "raw_amount") val rawAmount: RawAmount,
对于寻找最佳实践的 typeConvertor。现在我用值添加类名并保存为字符串,然后还用于读取提取类类型和值。
val rawAmountClassNameSeperatorChar = "#"
@TypeConverter
fun writeRawAmounts(value: RawAmount): String {
val result =
value::class.java.simpleName + rawAmountClassNameSeperatorChar + value.toString()
return result
}
阅读:
@TypeConverter
fun readRawAmounts(value: String): RawAmount {
val className = value.substringBefore(rawAmountClassNameSeperatorChar)
val rawAmountValue = value.substringAfter(rawAmountClassNameSeperatorChar)
val rawAmount = when (className) {
Child1::class.java.simpleName -> {
Child1(rawAmountValue)
}
Child2::class.java.simpleName -> {
Child2(rawAmountValue)
}
else -> {
Child2(rawAmountValue)
}
}
return rawAmount
}
它工作正常,因为我也用它保存了类型,而且在 sql 查询中也因为类型转换它工作得很好。唯一的问题是我正在向 DB 添加一些东西,而 DB 字段格式不是任何全球标准,而是我自己的标准 classname#value
。
我正在为此寻找更好的实践。我们知道json总是需要一个类型进行转换,保存时我们知道类型并且可以准备
@TypeConverter
fun writeRawAmounts(value: RawAmount): String {
val type = if(value is Child1){
object : TypeToken<Child1>() {}.type
}else{
object : TypeToken<Child2>() {}.type
}
return Gson().toJson(value,type)
}
但是对于阅读我们会有问题。我还尝试为我的多态类使用自定义 gson 解析器,但无法实现 goo 。 所以期待知道更好的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。