我正在为我的 Room 数据库编写一个类型转换器。我有几个自定义枚举类,我想在存储在数据库中时将它们全部转换为其序数。那么,有没有办法简化它(例如传递通用枚举类型),而不是为每个单独的类编写以下内容?
class Converter {
@TypeConverter
fun toOrdinal(type: TypeA): Int = type.ordinal
@TypeConverter
fun toTypeA(ordinal: Int): TypeA = TypeA.values().first { it.ordinal == ordinal }
@TypeConverter
fun toOrdinal(type: TypeB): Int = type.ordinal
@TypeConverter
fun toTypeB(ordinal: Int): TypeB = TypeB.values().first { it.ordinal == ordinal }
...
}
正如所讨论的here https://stackoverflow.com/q/49398023/4465208, Room 目前无法处理通用转换器。我认为你能做的最好的事情就是创建扩展,使编写这些枚举转换器更快:
@Suppress("NOTHING_TO_INLINE")
private inline fun <T : Enum<T>> T.toInt(): Int = this.ordinal
private inline fun <reified T : Enum<T>> Int.toEnum(): T = enumValues<T>()[this]
这会将每对转换器简化为以下代码:
@TypeConverter fun myEnumToTnt(value: MyEnum) = value.toInt()
@TypeConverter fun intToMyEnum(value: Int) = value.toEnum<MyEnum>()
或者,如果您可能存储空值:
@TypeConverter fun myEnumToTnt(value: MyEnum?) = value?.toInt()
@TypeConverter fun intToMyEnum(value: Int?) = value?.toEnum<MyEnum>()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)