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

时间:2019-08-02 12:46:51

标签: android kotlin enums android-room converters

我必须将List id is: 1 List id is: 2 List id is: 3 枚举中的值写入数据库。编译期间发生错误。我在做什么错了?

  

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

enum

6 个答案:

答案 0 :(得分:18)

您可以将其转换为每个枚举,如下所示:

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编译器中认真添加注释和Enums生成器。

最后,用以下方法注释数据库类,实体类,dao类,dao方法,dao方法参数或实体字段类:

@TypeConverters(Converters::class)

答案 1 :(得分:8)

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

"如果 Enum 已经存在用于读取的单向类型转换器,Room 可能会意外使用内置的 String 到 Enum 转换器,这可能不是我们想要的。这是一个已知问题,可以通过将其设置为双向转换器。”

答案 2 :(得分:3)

要解决此问题,请使用Database注释(而不是@TypeConverters)为enum class类注释。

示例:

@Database(entities = arrayOf(User::class), version = 1)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

选中https://developer.android.com/training/data-storage/room/referencing-data

答案 3 :(得分:3)

对于Java开发人员

枚举

public enum Health {
    NONE(-1),
    VERY_BAD(0);

    public final int value;

    Health(int newValue) {
        value = newValue;
    }

    public int getValue() {
        return value;
    }
}

类型转换器

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]);
    }

}

答案 4 :(得分:1)

枚举类;

enum class Priority {
HIGH,
MEDIUM,
LOW
}

转换器类;

class Converter {

@TypeConverter
fun fromPriority(priority: Priority): String {
    return priority.name
}

@TypeConverter
fun toPriority(priority: String): Priority {
    return Priority.valueOf(priority)
}

}

用法;

@Database(entities = [MyData::class], version = 1, exportSchema = false)
@TypeConverters(Converter::class)
abstract class MyDatabase : RoomDatabase() {

  // todo

}

答案 5 :(得分:0)

从 Room 2.3.0 版开始,您可以在此处保存 Enum Look https://developer.android.com/jetpack/androidx/releases/room?hl=ru#version_230_3