Error de la sala de Android: TypeConverter no reconocido para la list de enumeraciones

La biblioteca de la sala no reconoce un TypeConverter que creé para una List de enumeraciones. Sin embargo, cuando cambio esto a un ArrayList de enumeraciones funciona bien. ¿Alguien tiene alguna idea de por qué y qué puedo hacer para que esto funcione con List ? (Usar List en Kotlin es más fácil y realmente no quiero convertirlo de nuevo en ArrayList solo por esto).

Aquí está mi código:

Mi model:

 @Entity data class Example(@PrimaryKey val id: String?, val name: String, var days: List<DayOfWeek>?) 

DayOfWeek es una enumeración:

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

Mi 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()) } } } 

Y lo configuré en mi class DB así:

 @Database(entities = arrayOf(Example::class), version = 1) @TypeConverters(DayOfWeekConverter::class) abstract class AppDatabase : RoomDatabase() { abstract fun exampleDao(): ExampleDao } 

Mi DAO se ve así:

 @Dao interface ExampleDao { @Query("SELECT * FROM example") fun getAll(): LiveData<List<Example>> @Insert(onConflict = REPLACE) fun save(examples: List<Example>) } 

El error que recibo con este código es:

 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; 

Como dije antes, si cambio la propiedad days a ArrayList<DayOfWeek> (y ArrayList<DayOfWeek> los cambios en ArrayList en DayOfWeekConverter ), entonces todo funciona bien. Si alguien puede ayudarme a resolver esto y decirme cómo puedo usar List aquí, sería de gran ayuda, me está volviendo loco: /.

No tenemos forma de almacenar y get una Lista enumerada sin una list de matriz. La habitación no lo admite. Pero si desea evitar el uso de la list de arreglos, puede crear un object ListDayOfWeek con List como atributo. Lo intenté y está bien. Si necesita un código, responda aquí. Lo publicaré.

No debe almacenarlo así en su database. Es mejor build algo así y almacenarlo como int:

 enum class DaysOfWeek(var bitValue: Int) { Monday(64), Tuesday(32), Wednesday(16), Thursday(8), Friday(4), Saturday(2), Sunday(1); } 

Finalmente, su utilidad funciona para convertir de / a enum.

 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 } 

Ahora puede almacenar un int y get los días laborables más tarde:

 @Entity data class Example(@PrimaryKey val id: String?, val name: String, var days: Int = 0) 

o usa la enumeración y escribe un convertidor de tipo apropiado para eso.

 @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) } } 

Puede recorrer la enumeración y get todos los días mediante el uso de

 for (aDaysOfWeekEnumSet in daysOfWeekEnumSet) info{ "day = ${aDaysOfWeekEnumSet.name"} 

El código no se ha probado porque no estoy en mi computadora, pero esto debería mostrar el concepto que funciona mejor que almacenar una enumeración (que es solo un alias de un valor pnetworkingefinido).

  • Por qué kotlin está equivocado: val minT: largo = -9223372036854775808L //Long.MIN_VALUE
  • Android no ha podido crear instancias de una o más classs
  • No llame a setOnClickListener para un AdapterView
  • RuntimeException si minifyEnabled es verdadero con la class ViewModel
  • Que hace ?. significa en Kotlin cuando se usa en el lado izquierdo de una tarea?
  • Obtener el porcentaje de orientación en píxeles mediante progtwigción
  • ¿Cómo puedo filtrar un valor de una list de arrays en Kotlin?
  • El plugin de JaCoCo Gradle informa la proporción cubierta de class 0.0 para cada package
  • Hibernate ignora el tipo de búsqueda 'vago' y carga las properties de inmediato
  • Variable Kotlin String en el parámetro de function autocast a java.lang.String, ¿por qué?
  • Agregar .putExtra () a un Intento proporciona el código de retorno: -1