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 次 |
| 最近记录: |