Библиотека Room не распознает TypeConverter
, который я создал для List
перечислений. Однако, когда я меняю его на ArrayList
перечислений, он работает нормально. Кто-нибудь знает, почему и что я могу сделать, чтобы эта работа работала с List
? (Использовать 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]
}
}
}
My 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()) }
}
}
И я установил его в своем классе БД следующим образом:
@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
в DayOfWeekConverter
), тогда все будет работать нормально. Если бы кто-нибудь мог помочь мне разобраться в этом и рассказать, как я могу использовать List
здесь, это было бы большим подспорьем, это сводит меня с ума: /.