如何在数据库房间保存枚举字段? [英] How to save enum field in the database room?

查看:46
本文介绍了如何在数据库房间保存枚举字段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须将 enum 枚举中的值写入数据库.编译时发生错误.我做错了什么?

<块引用>

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

@ColumnInfo(name = "state_of_health")@TypeConverters(HealthConverter::class)var health:健康枚举类健康(val 值:Int){无(-1),非常坏(0),...}类 HealthConverter{@TypeConverterfun fromHealth(value: Health): Int{返回值.ordinal}@TypeConverterfun toHealth(value: Int): Health{返回时(值){-1 ->健康.NONE0 ->健康.非常糟糕...否则 ->健康.优秀}}}

解决方案

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

类转换器{@TypeConverterfun toHealth(value: String) = enumValueOf(value)@TypeConverterfun fromHealth(value: Health) = value.name}

或者,如果您更喜欢将其存储为 SQL integer,您也可以使用序数:

类转换器{@TypeConverterfun toHealth(value: Int) = enumValues()[value]@TypeConverterfun fromHealth(value: Health) = value.ordinal}

不幸的是,没有办法使用泛型Enum来实现这一点,因为未绑定的泛型会引发错误不能在类型转换器中使用未绑定的泛型.>

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

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

@TypeConverters(Converters::class)

I must write the value from the enum enumeration to the database. An error occurs during compilation. What am I doing wrong?

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

}

解决方案

You can make a convert to each enum, like this:

class Converters {

     @TypeConverter
     fun toHealth(value: String) = enumValueOf<Health>(value)

     @TypeConverter
     fun fromHealth(value: Health) = value.name
}

Or if you prefer store it as SQL integer, you can use ordinal too:

class Converters {

    @TypeConverter
    fun toHealth(value: Int) = enumValues<Health>()[value]

    @TypeConverter
    fun fromHealth(value: Health) = value.ordinal
}

Unfortunatally, there is no way to use generics Enum<T> to accomplish this since unbound generics will raise an error Cannot use unbound generics in Type Converters.

Android Room team could seriously add an annotation and a generator for Enums to their kapt compiler.

Finally, annotate a database class, entity class, dao class, dao method, dao method parameter or entity field class with this:

@TypeConverters(Converters::class)

这篇关于如何在数据库房间保存枚举字段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆