es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo guardar una List en una entidad?

Estoy guardando una entidad que se ve así:

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

Y cuando ejecuto la aplicación, obtengo este mensaje de error:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Se esperaba un int pero era BEGIN_OBJECT en la línea 1 columna 3 ruta $[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)

Después de eso, intenté usar un convertidor como este:

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

Desafortunadamente, eso tampoco funcionó.

¿Cómo puedo lograr esto?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que hay un problema con la sintaxis JSON de los datos que se están recuperando de la base de datos. Específicamente, la aplicación parece esperar un int pero en su lugar encuentra un objeto en la línea 1 columna 3 ruta $[0].

    Para resolver este problema, puede modificar su código existente para actualizar la lógica de conversión de tipo para el campo productPresentationList. Aquí hay una versión actualizada de las funciones TypeConverter que puede usar:

    @TypeConverter
    fun fromJson(value: String): List<int> {
        val listType = object : TypeToken<><int>>() {}.type
        return Gson().fromJson(value, listType)
    }
    
    @TypeConverter
    fun toJson(list: List<int>): String {
        return Gson().toJson(list)
    }
    

    Además de actualizar las funciones TypeConverter, también puede actualizar la clase Entity para especificar el tipo correcto para el campo productPresentationList. Aquí está el código actualizado para la clase Entity:

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

    Con estos cambios realizados, la aplicación debería ser capaz de recuperar y almacenar correctamente la instancia de entidad sin encontrar errores de sintaxis JSON.

Comments are closed.