我有一个像下面这样的项目列表,我想进入一个数据库使用室。
data class MyRotasDayItem(
@PrimaryKey
@SerializedName("id")
val id: Long,
@SerializedName("date")
val date: String,
@Embedded
@SerializedName("dayEvents")
val dayEvents: List<SealedObj>
)
然而我似乎不能添加dayEvents。即使我做了类型列表,我得到...实体和POJO必须有一个可用的公共构造函数。我必须使用类型转换器吗?
如果列表中的Type是包含其他数据对象的Sealed类,如...
sealed class MySealedExample(
open val foo: Long,
open val bar: Long
) {
@PrimaryKey(autoGenerate = true)
var id: Int = 0
@Entity
data class AnExample1(
@Ignore override val foo: Long,
@Ignore override val bar: Long,
val something:String
) : MySealedExample(foo, bar)
@Entity
data class AnExample2(
@Ignore override val foo: Long,
@Ignore override val bar: Long,
val somethingElse:List<SomeObj>
) : MySealedExample(foo, bar)
}
不管怎样,把它插入数据库?
谢谢
2条答案
按热度按时间mspsb9vt1#
使用类型转换器,我遇到了一个类似的问题,并使用类型转换器修复了它。为了将密封类转换为字符串,反之亦然,我使用了这个gist中的Gson扩展。
2admgd592#
要将一个密封类保存到Room或SQL中,无论是作为
Entity
还是作为Embedded
对象,您都需要一个大数据类,其中包含所有密封变体的所有属性。然后使用Enum
类型来指示变体类型,以便稍后用于域和数据层之间的转换,或者如果您不使用Clean Architecture,则在代码中进行指示。但是坚实而灵活。我希望Room
会有一些注解,可以生成这样的代码,以摆脱样板代码。请检查我的答案在这里的完整版本与例子:https://stackoverflow.com/a/72535888/9005383
PS:如果以后链接断了,写评论,我会写一个新的例子。