【问题标题】:How can I save a List<Int> in an Entity?如何在实体中保存 List<Int>?
【发布时间】:2022-01-02 22:00:23
【问题描述】:

我正在保存一个看起来像这样的实体

@Entity
data class Entity(
    @PrimaryKey val id: Int,
    val productPresentationList: List<Int>,
    val supplierComparePriceList: List<SupplierComparePrice>
)

而且,当我运行应用程序时,我收到了这个错误消息

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected an int but was BEGIN_OBJECT at line 1 column 3 path $[0]
        at com.google.gson.Gson.fromJson(Gson.java:975)
        at com.google.gson.Gson.fromJson(Gson.java:928)
        at com.google.gson.Gson.fromJson(Gson.java:877)
        at com.yopdev.wabi2b.db.Converters.restoreProductPresentation(Converters.kt:162)
        at com.yopdev.wabi2b.db.dao.CartDao_Impl$6.call(CartDao_Impl.java:281)
        at com.yopdev.wabi2b.db.dao.CartDao_Impl$6.call(CartDao_Impl.java:262)
        at androidx.room.CoroutinesRoom$Companion$createFlow$1$1$1.invokeSuspend(CoroutinesRoom.kt:128)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)

所以,在那之后我尝试使用这样的转换器

   @TypeConverter
    fun restoreProductPresentation(listOfString: String): List<Int> =
        Gson().fromJson(listOfString, object : TypeToken<List<Int>>() {}.type)

    @TypeConverter
    fun saveProductPresentation(list: List<Int>): String =
        Gson().toJson(list)

不幸的是,这也不起作用。

我怎样才能做到这一点?

【问题讨论】:

    标签: android android-room


    【解决方案1】:

    您不能直接将列作为列表/数组。但是,您可以使用“holder”对象和 TypeConverter 来存储转换后的列表/数组。

    因此,例如,您可以:-

    data class MyListHolder(
        val myList: List<Int>
    )
    

    然后有实体:-

    @Entity
    data class Entity(
        @PrimaryKey val id: Int,
        val productPresentationList: MyListHolder,
        val supplierComparePriceList: List<SupplierComparePrice>
    )
    

    以及将 List 转换为实体可接受的类型的 TypeConverters。通常是 JSON 字符串,例如

    @TypeConverter
    fun fromMyListHolder(mlh: MyListHolder): String {
        return Gson().toJson(mlh)
    }
    @TypeConverter
    fun toStatesHolder(mlh: String): MyListHolder {
        return Gson().fromJson(mlh,MyListHolder::class.java)
    }
    

    注意。你有val supplierComparePriceList: List&lt;SupplierComparePrice&gt;,那么你需要以类似的方式处理这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-03
      • 2021-10-04
      • 2021-02-26
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 2015-12-23
      • 2011-11-13
      相关资源
      最近更新 更多