问题
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
}
}
}
回答1:
To fix this annotate your Database
class with @TypeConverters
annotation (and not your enum class
).
Example:
@Database(entities = arrayOf(User::class), version = 1)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Check https://developer.android.com/training/data-storage/room/referencing-data
回答2:
You can make a convert to each enum, like this:
@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:
@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.
来源:https://stackoverflow.com/questions/57326789/how-to-save-enum-field-in-the-database-room