Android室错误:types转换器无法识别列表的枚举
房间库不识别我为枚举List
创建的TypeConverter
。 但是,当我将其更改为枚举的ArrayList
它工作正常。 任何人有任何想法,为什么和我能做些什么来使这个工作与List
? (在Kotlin中使用列表更容易,我真的不希望只是因为这个原因转换回ArrayList
)。
这是我的代码:
我的模特:
@Entity data class Example(@PrimaryKey val id: String?, val name: String, var days: List?)
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 7) { throw RuntimeException("Invalid value for DayOfWeek: " + dayOfWeek) } return ENUMS[dayOfWeek - 1] } } }
我的TypeConverter
:
private const val SEPARATOR = "," class DayOfWeekConverter { @TypeConverter fun daysOfWeekToString(daysOfWeek: List?): String? { return daysOfWeek?.map { it.value }?.joinToString(separator = SEPARATOR) } @TypeConverter fun stringToDaysOfWeek(daysOfWeek: String?): List? { 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> @Insert(onConflict = REPLACE) fun save(examples: List) }
我得到这个代码的错误是:
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 days;
就像我上面所说,如果我将days
属性更改为ArrayList
(并对ArrayList
进行更改),那么一切正常。 如果任何人都可以帮我弄清楚这个,告诉我如何在这里使用List
,那会非常有帮助的,这让我疯狂:/。
由于某种原因,Room不喜欢Kotlin List
,但是当我用MutableList
替换List
,它开始工作:
@Entity data class Example(@PrimaryKey val id: String, val name: String, var days: MutableList?) class DayOfWeekConverter { companion object { @TypeConverter @JvmStatic fun daysOfWeekToString(daysOfWeek: MutableList ?): String? = daysOfWeek?.map { it.value }?.joinToString(separator = SEPARATOR) @TypeConverter @JvmStatic fun stringToDaysOfWeek(daysOfWeek: String?): MutableList ? = daysOfWeek?.split(SEPARATOR)?.map { DayOfWeek.of(it.toInt()) }?.toMutableList() } }
这不是完美的解决方案,但希望你可以进一步调查。
还需要将@PrimaryKey
更改为不可空
我们没有办法存储和获得没有数组列表的列表枚举。 房间不支持它。 但是如果你想避免使用数组列表,你可以创建一个ListDayOfWeek对象,List是一个属性。 我试过了,没关系。 如果您需要代码,请在此回复。 我会发布它。
你不应该像那样把它存储到你的数据库中。 更好地构建这样的东西,并将其存储为int:
enum class DaysOfWeek(var bitValue: Int) { Monday(64), Tuesday(32), Wednesday(16), Thursday(8), Friday(4), Saturday(2), Sunday(1); }
最后您的实用function将从/转换为枚举。
fun daysToBitValue(days: EnumSet): Int { var daysBitValue = 0 for (`val` in days) daysBitValue += `val`.bitValue return daysBitValue } private fun fromBitValues(origBitMask: Int): EnumSet { 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?) class DayOfWeekConverter { @TypeConverter fun daysOfWeekToString(daysOfWeek: EnumSet?) = daysOfWeek?.let{ YourUtilities.daysToBitValue(it) } @TypeConverter fun intToDaysOfWeek(daysOfWeek: Int?) = daysOfWeek?.let { YourUtilities.fromBitValues(it) } }
您可以遍历枚举并通过使用获取所有的日子
for (aDaysOfWeekEnumSet in daysOfWeekEnumSet) info{ "day = ${aDaysOfWeekEnumSet.name"}
代码是未经测试,因为我不在我的电脑上,但是这应该显示出更好的概念,然后存储一个枚举(这只是一个预定义的值的别名!)