Android Room - 插入密封类列表..或任何东西

aid*_*ack 8 android android-room

我有一个类似下面的项目列表,我想使用 room.log 输入到数据库中。

 data class MyRotasDayItem(
 @PrimaryKey
 @SerializedName("id")
 val id: Long,
 @SerializedName("date")
 val date: String,
 @Embedded
 @SerializedName("dayEvents")
 val dayEvents: List<SealedObj>
 )
Run Code Online (Sandbox Code Playgroud)

但是我似乎无法添加 dayEvents。即使我创建了类型 List 我得到...实体和 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)
}
Run Code Online (Sandbox Code Playgroud)

无论如何将其插入数据库?

谢谢

Ham*_*ood 2

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

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

@JvmStatic
@TypeConverter
fun sealedClassFromString(sealedClass: String) : SealedClass = sealedClass.let { GsonExtension.fromJson(it) }
Run Code Online (Sandbox Code Playgroud)