我在 SO 上见过这个问题好几次了。但是该解决方案似乎不适用于我的问题。
我有一个 Kotlin 数据类,用作 Room 中的实体
@Entity(tableName = "training_session")
data class SessionEntity(
@PrimaryKey(autoGenerate = false) val id: Long,
@ColumnInfo(name = "current_state_marker") val currentState: Short,
@Embedded val states: List<Int>
)
生产中
> Task :training-infrastructure:kaptDebugKotlin FAILED
error: Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). - java.util.List
error: Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). - java.util.List
在同一个项目中,我有一个非常相似的实体,它也有一个列表,并且不会产生任何错误。
尝试了MikeT提供的答案,对我来说,它需要对转换器的定义方式进行一些更改
data class SessionStateList (val stateList : List<Int>)
class SessionStateListConverter {
@TypeConverter
fun fromArraySessionStateList(sh: List<Int>?): String? {
return Gson().toJson(sh)
}
@TypeConverter
fun toArraySessionStateList(sh: String?): List<Int>? {
val listType: Type = object : TypeToken<ArrayList<Int?>?>() {}.type
return Gson().fromJson(sh,listType)
}
}
快速跟进。 我曾提到我有另一个具有
Embedded val something: List<Int>
的实体,但我没有注意到任何编译器错误。
我没有注意到任何编译器错误的原因是因为该实体未包含在
@Database
注释中。
您不能将列表/数组等作为列类型。所以你的问题集中在
@Embedded val states: List<Int>
你可以有一个 POJO,例如国家持有人:-
data class StatesHolder(
val stateList: List<Int>
)
然后有
@Entity(tableName = "training_session")
data class SessionEntity(
@PrimaryKey(autoGenerate = false) val id: Long,
@ColumnInfo(name = "current_state_marker") val currentState: Short,
val states: StatesHolder
)
然后,您将需要 TypeConverters 在 StatesHolder 对象与可存储类型之间进行转换。可能是一个字符串,也可能是 StatesHold 对象的 JSON 表示形式,例如
class Converters {
@TypeConverter
fun fromStatesHolder(sh: StatesHolder): String {
return Gson().toJson(sh)
}
@TypeConverter
fun toStatesHolder(sh: String): StatesHolder {
return Gson().fromJson(sh,StatesHolder::class.java)
}
}
您还需要使用定义 Converts::class 的 @TypeConverters 注释。如果在 @Database 级别编码,则转换器具有完整的范围。
所以在
@Database(.....)
之后你可以拥有:-
@TypeConverters(Converters::class)
我也有类似的问题,请问你解决了吗?