Room库无法识别我为List枚举创建的TypeConverter.但是,当我将其更改为ArrayList个枚举时,它工作得很好.有没有人知道为什么,我能做些什么来让List起作用?(使用Kotlin中的List更容易,我真的不想仅仅因为这个而来回转换到ArrayList).

Here is my code:

My model:

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

DayOfWeek is an enum:

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

}

And I set it in my DB class like this:

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

    abstract fun exampleDao(): ExampleDao

}

我的刀是这样的:

@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,这将是非常有帮助的,它让我发疯:/.

推荐答案

由于某些原因,Room不喜欢Kotlin List,但是当我用MutableList代替List时,它开始工作了:

@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更改为不可为空

Kotlin相关问答推荐

如何在Kotlin的嵌套作用域中解析对此的引用

API迁移到Spring Boot 3后,Spring Security无法工作

为什么Kotlin函数参数名会 destruct 方法调用?

如何为集成测试配置Gradle JVM测试套件?

Scala与Kotlin中的迭代

如何使用 Firebase 和 Kotlin 在文本 (Jetpack Compose) 中显示当前用户名?

如何在 micronaut 上启用 swagger UI?

Kotlin - 协程未按预期执行

Kotlin 条件格式字符串

将子元素放在一个列表中

is return inside function definition 也是 kotlin 中的表达式

如何在 Kotlin for Android 上使用setTextColor(hexaValue),

SpringBoot 2.5.0 对于 Jackson Kotlin 类的支持,请在类路径中添加com.fasterxml.jackson.module: jackson-module-kotlin

Kotlin:内部类如何访问在外部类中声明为参数的变量?

如何使用 Kotlin Coroutines 使 setOnClickListener debounce 1 秒?

将 Android Studio 升级到 3.1.0 后的 Android Support 插件错误

Kotlin的web-framework框架

如何将 Kotlin 日期中的字符串或时间戳格式化为指定的首选格式?

在Kotlin中使用@Service时引发异常

如何在使用Koin DI的活动之间共享同一个ViewModel实例?