Room库无法识别我为枚举的TypeConverter
创建的List
。但是,当我将其更改为枚举的ArrayList
时,它可以正常工作。任何人都知道为什么以及如何使用List
进行这项工作? (在Kotlin中使用List更容易,并且我真的不想仅因为这个原因就将其转换回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()) }
}
}
我将其设置在我的数据库类中,如下所示:
@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
,那将是非常有帮助的,它使我疯狂:/.。 最佳答案
由于某种原因,Room不喜欢Kotlin的List
,但是当我用List
替换MutableList
时,它开始起作用:
@Entity
data class Example(@PrimaryKey val id: String,
val name: String,
var days: MutableList<DayOfWeek>?)
class DayOfWeekConverter {
companion object {
@TypeConverter
@JvmStatic
fun daysOfWeekToString(daysOfWeek: MutableList<DayOfWeek>?): String? =
daysOfWeek?.map { it.value }?.joinToString(separator = SEPARATOR)
@TypeConverter
@JvmStatic
fun stringToDaysOfWeek(daysOfWeek: String?): MutableList<DayOfWeek>? =
daysOfWeek?.split(SEPARATOR)?.map { DayOfWeek.of(it.toInt()) }?.toMutableList()
}
}
这不是完美的解决方案,但希望您可以对此进行更多调查。
另外,您需要将
@PrimaryKey
更改为不可为空