How to save enum field in the database room?

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)

This is no longer an issue in version 2.3.0-alpha4: "Room will now default to using an Enum to String and vice versa type converter if none is provided. If a type converter for an enum already exists, Room will prioritize using it over the default one."

"If a one-way type converter for reading already exists for the Enum, Room might accidentally use the built-in String to Enum converter which might not be desired. This is a known issue and can be fixed by making it a two-way converter."