Android室错误:类型转换器无法识别列表的枚举
房间库不识别我为枚举List
创建的TypeConverter
。 但是,当我将其更改为枚举的ArrayList
它工作正常。 任何人有任何想法,为什么和我能做些什么来使这个工作与List
? (在Kotlin中使用列表更容易,我真的不希望只是因为这个原因转换回ArrayList
)。
这是我的代码:
我的模特:
@Entity data class Example(@PrimaryKey val id: String?, val name: String, var days: List<DayOfWeek>?)
DayOfWeek
是一个枚举:
enum class DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; val value: Int get() = ordinal + 1 companion object { private val ENUMS = DayOfWeek.values() fun of(dayOfWeek: Int): DayOfWeek { if (dayOfWeek < 1 || dayOfWeek > 7) { throw RuntimeException("Invalid value for DayOfWeek: " + dayOfWeek) } return ENUMS[dayOfWeek - 1] } } }
我的TypeConverter
:
private const val SEPARATOR = "," class DayOfWeekConverter { @TypeConverter fun daysOfWeekToString(daysOfWeek: List<DayOfWeek>?): String? { return daysOfWeek?.map { it.value }?.joinToString(separator = SEPARATOR) } @TypeConverter fun stringToDaysOfWeek(daysOfWeek: String?): List<DayOfWeek>? { return daysOfWeek?.split(SEPARATOR)?.map { DayOfWeek.of(it.toInt()) } } }
我把它设置在我的DB类中,如下所示:
@Database(entities = arrayOf(Example::class), version = 1) @TypeConverters(DayOfWeekConverter::class) abstract class AppDatabase : RoomDatabase() { abstract fun exampleDao(): ExampleDao }
我的DAO看起来像这样:
@Dao interface ExampleDao { @Query("SELECT * FROM example") fun getAll(): LiveData<List<Example>> @Insert(onConflict = REPLACE) fun save(examples: List<Example>) }
我得到这个代码的错误是:
error: Cannot figure out how to save this field into database. You can consider adding a type converter for it. e: e: private java.util.List<? extends com.example.DayOfWeek> days;
就像我上面所说,如果我将days
属性更改为ArrayList<DayOfWeek>
(并对ArrayList<DayOfWeek>
进行更改),那么一切正常。 如果任何人都可以帮我弄清楚这个,告诉我如何在这里使用List
,这会有很大的帮助,这让我疯狂:/。
我们没有办法存储和获得没有数组列表的列表枚举。 房间不支持它。 但是如果你想避免使用数组列表,你可以创建一个ListDayOfWeek对象,List是一个属性。 我试过了,没关系。 如果您需要代码,请在此回复。 我会发布它。
你不应该像那样把它存储到你的数据库中。 更好地构建这样的东西,并将其存储为int:
enum class DaysOfWeek(var bitValue: Int) { Monday(64), Tuesday(32), Wednesday(16), Thursday(8), Friday(4), Saturday(2), Sunday(1); }
最后您的实用功能将从/转换为枚举。
fun daysToBitValue(days: EnumSet<DaysOfWeek>): Int { var daysBitValue = 0 for (`val` in days) daysBitValue += `val`.bitValue return daysBitValue } private fun fromBitValues(origBitMask: Int): EnumSet<DaysOfWeek> { val ret_val = EnumSet.noneOf(DaysOfWeek::class.java) var bitMask = origBitMask for (`val` in DaysOfWeek.values()) { if (`val`.bitValue and bitMask == `val`.bitValue) { bitMask = bitMask and `val`.bitValue.inv() ret_val.add(`val`) } } if (bitMask != 0) { throw IllegalArgumentException(String.format(Locale.getDefault(), "Bit mask value 0x%X(%d) has unsupported bits 0x%X. Extracted values: %s", origBitMask, origBitMask, bitMask, ret_val)) } return ret_val }
现在你可以存储一个int,并在以后的工作日:
@Entity data class Example(@PrimaryKey val id: String?, val name: String, var days: Int = 0)
或者你使用枚举,并写一个适当的typeconverter。
@Entity data class Example(@PrimaryKey val id: String?, val name: String, var days: EnumSet<DaysOfWeek>?) class DayOfWeekConverter { @TypeConverter fun daysOfWeekToString(daysOfWeek: EnumSet<DayOfWeek>?) = daysOfWeek?.let{ YourUtilities.daysToBitValue(it) } @TypeConverter fun intToDaysOfWeek(daysOfWeek: Int?) = daysOfWeek?.let { YourUtilities.fromBitValues(it) } }
您可以遍历枚举并通过使用获取所有的日子
for (aDaysOfWeekEnumSet in daysOfWeekEnumSet) info{ "day = ${aDaysOfWeekEnumSet.name"}
代码是未经测试,因为我不在我的电脑上,但是这应该显示出更好的概念,然后存储一个枚举(这只是一个预定义的值的别名!)
- Kotlin的Android内容提供商
- Kotlin类型不匹配编译错误:需要成功<T>,找到MyError
- 为什么Android Studio 3测试版有Build APK(s)选项而不是Build APK?
- 从活动Kotlin获得额外的字符串
- 在BottomsheetDialog中使用setcontentview时,会出现类似“以下函数都不能用提供的参数调用”的错误
- 在使用kotlin时,使用实体和Dao文件的正式/正确的方式是什么?
- Android Studio 3 canary&Kotlin
- 错误:未找到注释处理器'__gen.AnnotationProcessorWrapper_debug_android_databinding_annotationprocessor_ProcessDataBinding'
- 多次运行浓缩咖啡测试