android - 如何在数据库机房中保存枚举字段?

标签 android kotlin enums android-room converters

我必须将 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/

相关文章:

android - Doppio One-Regular.ttf字体不支持android中的ft字符

android - ImageButton 使用 @android :drawable/programmatically 设置可绘制

list - Kotlin 将集合中的 isEmpty()&last() 替换为 lastOrNull()

kotlin - 使用自定义 setter 定义可变属性

java - Hibernate @Enumerated 映射

android - 应用程序启动时出现 ClassNotFoundException

android - Parse.com 上的一对多关系

kotlin - 使用多平台模拟 kotlin 中的常见测试

java - Hibernate 枚举转换和转换器映射

cocoa - 新的 iOS9/OSX10.11 NSNumberFormatter Style 枚举值是什么意思?