Error of type convertors in room database

Viewed 43

I am trying to make a type convertor for a model class in my app. The model class is given below.


Order

@Entity(tableName = "Orders")
data class Order(
    @PrimaryKey
    var customerId:String,
    var companyId:String,
    var orderBookerId:String,
    @ColumnInfo(name = "items") var list:List<SelectedProductsModel>
)

SelectedProductsModel

data class SelectedProductsModel(
    var quantity: Int,
    var skuId: String,
    var companyId: String,
    var productName: String?,
    var vendor_brand_name: String,
    var purchasePrice: Int,
    var image: String,
    var position: Int
):Serializable

now as you can see that in the Order class there is a var list:List<SelectedProductsModel>. I want to write a type converter for this list but i keep getting an error


error: cannot find symbol @androidx.room.TypeConverters(value = {SelectedProductModelConvertor.class})


following is my Room database class

@Database(entities = [VisitedPjpModel::class,Order::class], version = 1)
@TypeConverters(SelectedProductModelConvertor::class)
abstract class RoomDatabaseClass : RoomDatabase()
{
    public abstract fun visitedDao(): VisitedPjpDao
    public abstract fun orderDao():OrderDao


    companion object
    {
        private var instance: RoomDatabaseClass? = null

        fun getInstance(context: Context): RoomDatabaseClass?
        {
            if (instance == null)
            {
                synchronized(RoomDatabaseClass::class)
                {
                    instance = Room.databaseBuilder(context, RoomDatabaseClass::class.java, "tarseel_database").allowMainThreadQueries().build()
                }
            }

            return instance
        }
    }
}

i have tried different implementations of type convertors but iam getting the same error which is mentioned above. following are the implementations of type converotrs that i have tried


class SelectedProductModelConvertor
{
  
    @TypeConverter
    fun fromList(value : List<SelectedProductsModel>) = Json.encodeToString(value)

    @TypeConverter
    fun toList(value: String) = Json.decodeFromString<List<SelectedProductsModel>>(value)
}

class SelectedProductModelConvertor
{

    @TypeConverter
    fun listToJson(value: List<SelectedProductsModel>) = Gson().toJson(value)

    @TypeConverter
    fun jsonToList(value: String) = Gson().fromJson(value, Array<SelectedProductsModel>::class.java).toList()
}

  1. class SelectedProductModelConvertor {

      @TypeConverter
      fun fromListLangList(value: List<SelectedProductsModel>): String
      {
          val gson = Gson()
          val type = object : TypeToken<List<SelectedProductsModel>>()
          {}.type
          return gson.toJson(value, type)
      }
    
      @TypeConverter
      fun toSelectedProductsModelList(value: String): List<SelectedProductsModel>
      {
          val gson = Gson()
          val type = object : TypeToken<List<SelectedProductsModel>>()
          {}.type
          return gson.fromJson(value, type)
      }
    

    }


I have tried all these type convertors but iam getting error. please help me

1 Answers

You cannot have a List/Array for a column.

What you can do, is have a class that holds the List/Array and have a Type Converter for that.

So you could have:-

data class SelectedProductsModelList(
    val selectedProductsModelList: List<SelectedProductsModel>
)

Then have :-

@Entity(tableName = "Orders")
data class Order(
    @PrimaryKey
    var customerId:String,
    var companyId:String,
    var orderBookerId:String,
    @ColumnInfo(name = "items") var list:SelectedProductsModelList //<<<<<<<<<<
)

and TypeConverters that convert from/to a SelectProductsModelList object e.g.

@TypeConverter
fun fromSelectedProductsModelList(selectedProductsModelList: SelectedProductsModelList): String {
    return Gson().toJson(selectedProductsModelList)
}
@TypeConverter
fun toSelectedProductsModelList(json: String): SelectedProductsModelList {
    return Gson().fromJson(json,SelectedProductsModelList::class.java)
}
Related