Fra*_*nco 12 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>?)
Run Code Online (Sandbox Code Playgroud)
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]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
我的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()) }
    }
}
Run Code Online (Sandbox Code Playgroud)
我在我的数据库类中设置它像这样:
@Database(entities = arrayOf(Example::class), version = 1)
@TypeConverters(DayOfWeekConverter::class)
abstract class AppDatabase : RoomDatabase() {
    abstract fun exampleDao(): ExampleDao
}
Run Code Online (Sandbox Code Playgroud)
我的DAO看起来像这样:
@Dao
interface ExampleDao {
    @Query("SELECT * FROM example")
    fun getAll(): LiveData<List<Example>>
    @Insert(onConflict = REPLACE)
    fun save(examples: List<Example>)
}
Run Code Online (Sandbox Code Playgroud)
我用这段代码得到的错误是:
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;
Run Code Online (Sandbox Code Playgroud)
就像我上面说的,如果我改变的days属性ArrayList<DayOfWeek>(和进行更改ArrayList的DayOfWeekConverter),那么一切工作正常.如果有人能帮助我解决这个问题并告诉我如何List在这里使用它会有很大的帮助,它让我发疯:/.
Tom*_*ski 14
出于某种原因,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()
    }
}
Run Code Online (Sandbox Code Playgroud)
这不是完美的解决方案,但希望您可以通过它进行更多调查.
您还需要更改@PrimaryKey为不可为空
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           4818 次  |  
        
|   最近记录:  |