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

09-10 07:07
查看更多