我必须将 enum
枚举的值写入数据库。编译过程中发生错误。我做错了什么?
Cannot figure out how to save this field into database. You can consider adding a type converter for it.
@ColumnInfo(name = "state_of_health")
@TypeConverters(HealthConverter::class)
var health: Health
enum class Health(val value: Int){
NONE(-1),
VERY_BAD(0),
...
}
class HealthConverter{
@TypeConverter
fun fromHealth(value: Health): Int{
return value.ordinal
}
@TypeConverter
fun toHealth(value: Int): Health{
return when(value){
-1 -> Health.NONE
0 -> Health.VERY_BAD
...
else -> Health.EXCELLENT
}
}
}
最佳答案
您可以对每个枚举进行转换,如下所示:
class Converters {
@TypeConverter
fun toHealth(value: String) = enumValueOf<Health>(value)
@TypeConverter
fun fromHealth(value: Health) = value.name
}
或者,如果您更喜欢将其存储为 SQL integer
,你也可以使用序号:
class Converters {
@TypeConverter
fun toHealth(value: Int) = enumValues<Health>()[value]
@TypeConverter
fun fromHealth(value: Health) = value.ordinal
}
不幸的是,没有办法使用泛型Enum<T>
完成此操作,因为未绑定(bind)泛型会引发错误 Cannot use unbound generics in Type Converters
.
Android Room 团队可以认真地为他们的 kapt 编译器添加注释和枚举生成器。
最后,注解一个数据库类,实体类,dao类,dao方法,dao方法参数或者实体字段类,这样写:
@TypeConverters(Converters::class)
关于android - 如何在数据库机房中保存枚举字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57326789/