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"} 

代码是未经测试,因为我不在我的电脑上,但是这应该显示出更好的概念,然后存储一个枚举(这只是一个预定义的值的别名!)