【发布时间】:2018-03-28 20:57:11
【问题描述】:
Room 库无法识别我为 List 的枚举创建的 TypeConverter。但是,当我将其更改为枚举的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>(并在DayOfWeekConverter 中更改ArrayList),那么一切正常。如果有人能帮我解决这个问题并告诉我如何在这里使用List,那将非常有帮助,它让我发疯:/。
【问题讨论】:
-
请发布您的“ExampleDao”课程。
-
DAO 似乎与我遇到的@PravinDivraniya 问题无关,但我现在已经添加了它,以防它帮助您找出问题所在。干杯。
-
我遇到了同样的问题。鉴于显然这是不可能的,我创建了一个功能请求:issuetracker.google.com/issues/69164099
-
@Franco,我已经更新了我的解决方案以使用 Room 进行编译
-
谢谢@TomekPolański,我会在有时间的时候尝试测试它,如果我能验证它是否按预期工作,我会接受你的回答。
标签: android kotlin android-room android-architecture-components