我必须将List id is: 1
List id is: 2
List id is: 3
枚举中的值写入数据库。编译期间发生错误。我在做什么错了?
无法弄清楚如何将该字段保存到数据库中。您可以考虑为其添加类型转换器。
enum
答案 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