如何解决“实体和 POJO 必须有可用的公共构造函数”

问题描述 投票:0回答:2

我在 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
注释中。

android kotlin android-room
2个回答
6
投票

您不能将列表/数组等作为列类型。所以你的问题集中在

@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
)
  • 请注意,您不能嵌入 StatesHolder,因为那样只会插入 List。如果你想嵌入,那么你必须嵌入一个使用 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)

0
投票

我也有类似的问题,请问你解决了吗?

© www.soinside.com 2019 - 2024. All rights reserved.