How to save enum field in the database room?

后端 未结 4 540
不思量自难忘°
不思量自难忘° 2020-12-10 11:47

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

Cannot figur

相关标签:
4条回答
  • 2020-12-10 11:56

    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)
    
    0 讨论(0)
  • 2020-12-10 11:57

    Enum class;

    enum class Priority {
    HIGH,
    MEDIUM,
    LOW
    }
    

    Converter class;

    class Converter {
    
    @TypeConverter
    fun fromPriority(priority: Priority): String {
        return priority.name
    }
    
    @TypeConverter
    fun toPriority(priority: String): Priority {
        return Priority.valueOf(priority)
    }
    
    }
    

    usage;

    @Database(entities = [MyData::class], version = 1, exportSchema = false)
    @TypeConverters(Converter::class)
    abstract class MyDatabase : RoomDatabase() {
    
      // todo
    
    }
    
    0 讨论(0)
  • 2020-12-10 11:59

    For java developers

    The Enum

    public enum Health {
        NONE(-1),
        VERY_BAD(0);
    
        public final int value;
    
        Health(int newValue) {
            value = newValue;
        }
    
        public int getValue() {
            return value;
        }
    }
    

    The type converter

    public class HealthConverter {
    
        /**
         * Convert Health to an integer
         */
        @TypeConverter
        public static int fromHealthToInt(Health value) {
            return value.ordinal();
        }
    
        /**
         * Convert an integer to Health
         */
        @TypeConverter
        public static Health fromIntToHealth(int value) {
            return (Health.values()[value]);
        }
    
    }
    
    0 讨论(0)
  • 2020-12-10 12:08

    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

    0 讨论(0)
提交回复
热议问题