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

新手上路,请多包涵

我必须将 enum 枚举中的值写入数据库。编译过程中发生错误。我究竟做错了什么?

无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。

 @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
        }
    }

}

原文由 Viewed 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 996
2 个回答

您可以对每个枚举进行转换,如下所示:

 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> 来完成此操作,因为未绑定的泛型会引发错误 Cannot use unbound generics in Type Converters

Android Room 团队可以认真地为他们的 kapt 编译器添加注释和枚举生成器。

最后,注释一个数据库类、实体类、dao 类、dao 方法、dao 方法参数或实体字段类:

 @TypeConverters(Converters::class)

原文由 Allan Veloso 发布,翻译遵循 CC BY-SA 4.0 许可协议

这在 版本 2.3.0-alpha4 中不再是一个问题:“如果没有提供,Room 现在将默认使用 Enum 到 String 类型转换器,反之亦然。如果枚举的类型转换器已经存在,Room 将优先使用它超过默认值。”

“如果枚举已经存在用于读取的单向类型转换器,Room 可能会意外使用内置的字符串到枚举转换器,这可能是不需要的。这是一个已知问题,可以通过将其设为双向来解决转换器。”

原文由 Chr 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题