Json 在数据库室中保存多态性(抽象类)的最佳实践
我有一个抽象类,它有很多孩子,他们想把抽象类保存在房间的桌子上Json 在数据库室中保存多态性(抽象类)的最佳实践,json,type-conversion,polymorphism,android-room,abstract-class,Json,Type Conversion,Polymorphism,Android Room,Abstract Class,我有一个抽象类,它有很多孩子,他们想把抽象类保存在房间的桌子上 @ColumnInfo(name = "raw_amount") val rawAmount: RawAmount, 寻找最佳实践的typeConvertor。现在,我添加了带有value和save-as-String的类名,然后还添加了read-extract-class-type和value val rawAmountClassNameSeperatorChar = "#" @Type
@ColumnInfo(name = "raw_amount") val rawAmount: RawAmount,
寻找最佳实践的typeConvertor。现在,我添加了带有value和save-as-String的类名,然后还添加了read-extract-class-type和value
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)
}
@TypeConverter
有趣的WriterWamounts(值:RawAmount):字符串{
val type=if(值为Child1){
对象:TypeToken(){}.type
}否则{
对象:TypeToken(){}.type
}
返回Gson().toJson(值,类型)
}
但对于阅读,我们会有问题。我还尝试为我的多态性类提供一个定制的gson解析器,但无法实现goo解析器。
所以期待知道更好的解决方案