Android 房间错误 : TypeConverter not recognised for List of Enums

标签 android kotlin android-room android-architecture-components

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属性(property)到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 更改为不可为空

关于Android 房间错误 : TypeConverter not recognised for List of Enums,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46785534/

相关文章:

android - 从 Moshi 类型适配器的具体泛型类型中获取 ParameterizedType

java - Android VideoView 在 onPrepared 中崩溃

java - 房间数据库不需要新的线程来进行长时间的查询操作

java - Android Studio Room Persistence - 每个实体是否应该有一个单独的 DAO,这对存储库类有何影响?

java - 移除 ActionBar 边框

java - 扩展应用程序的多个类

kotlin - 在 Kotlin 中,只有 getter 的私有(private)属性和私有(private)函数有什么区别吗?

android - 如何在 Kotlin 中从 Android "strings.xml"访问值

java - 如何在 Kotlin DSL 中动态加载 TeamCity 子项目

java - 即使从服务器中删除后,数据仍显示在房间数据库中