Android房间-插入密封类的列表..或任何东西

ha5z0ras  于 2023-03-06  发布在  Android
关注(0)|答案(2)|浏览(89)

我有一个像下面这样的项目列表,我想进入一个数据库使用室。

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)
}

不管怎样,把它插入数据库?
谢谢

mspsb9vt

mspsb9vt1#

使用类型转换器,我遇到了一个类似的问题,并使用类型转换器修复了它。为了将密封类转换为字符串,反之亦然,我使用了这个gist中的Gson扩展。

@JvmStatic
@TypeConverter
fun sealedClassToString(sealedClass: SealedClass) : String = GsonExtension.toJson(sealedClass)

@JvmStatic
@TypeConverter
fun sealedClassFromString(sealedClass: String) : SealedClass = sealedClass.let { GsonExtension.fromJson(it) }
2admgd59

2admgd592#

要将一个密封类保存到Room或SQL中,无论是作为Entity还是作为Embedded对象,您都需要一个大数据类,其中包含所有密封变体的所有属性。然后使用Enum类型来指示变体类型,以便稍后用于域和数据层之间的转换,或者如果您不使用Clean Architecture,则在代码中进行指示。但是坚实而灵活。我希望Room会有一些注解,可以生成这样的代码,以摆脱样板代码。
请检查我的答案在这里的完整版本与例子:https://stackoverflow.com/a/72535888/9005383
PS:如果以后链接断了,写评论,我会写一个新的例子。

相关问题