TypeConverters - Как сохранить массив объектов в базе данных? - PullRequest
0 голосов
/ 11 января 2020

My JSON выглядит следующим образом (посмотрите на бонусный массив объектов):

objects:[
{
    name,
    date,
    string,
    string,
        bonus:[
            {
            bonus_name
            bonus_amount
            bonus_imgurl
            },{
            bonus_name
            bonus_amount
            bonus_imgurl
            },{
            bonus_name
            bonus_amount
            bonus_imgurl
            }
        ]
},
    string,
    string,
        bonus:[
            {
            bonus_name
            bonus_amount
            bonus_imgurl
            },{
            bonus_name
            bonus_amount
            bonus_imgurl
            },{
            bonus_name
            bonus_amount
            bonus_imgurl
            }
        ]
}

]

Я уже успешно анализирую массив объектов в базе данных, где каждый массив получает свою собственную строку. Теперь я хочу добавить бонус в каждую строку с помощью TypeConverter

@Entity(tableName = config.TABLE_EVENTS)
data class RoomEventsModel(
        @ColumnInfo(name = "name")
        var eventName: String?, 
        ....
        @TypeConverters(value = [Converters::class])
        @ColumnInfo(name = "bonus_values") var bonus_value: List<Bonus>
){
@PrimaryKey(autoGenerate = true)
var id: Int? = null
}

Converters.class выглядит следующим образом:

class Converters : Serializable {
    companion object {
        @TypeConverter
        fun fromBonusList(bonusElements : List<Bonus>): String {
            val gson = Gson()
            val type = object : TypeToken<List<Bonus>>() {
            }.type
            return gson.toJson(bonusElements, type)
        }

    @TypeConverter
    fun toBonusList(bonusElements: String?): ArrayList<HashMap<List<Bonus>, RoomEventsModel>>? {
        if (bonusElements == null) {
            return null
        }
        val gson = Gson()
        val type = object : TypeToken<List<Bonus>>() {

        }.type
        return gson.fromJson<ArrayList<HashMap<List<Bonus>,RoomEventsModel>>>(bonusElements, type)
    }
}

Я добавил TypeConverter в свой класс базы данных приложений

 @TypeConverters(value = [Converters::class])
abstract class AppDatabase : RoomDatabase() {
    ...
}

Компиляция говорит мне:

Класс упоминается как преобразователь, но у него нет методов преобразования.

Что не так с кодом?

1 Ответ

1 голос
/ 11 января 2020

Ваш метод toBonusList(...) должен возвращать List<Bonus> в вашем классе Converters, поскольку вы сохраняете bonus_value как List<Bonus> в своем классе данных.

Преобразователи типов должны иметь соответствующие методы toSomeValue() и fromSomeValue(), где параметр в методе to соответствует возвращаемому значению метода from, и наоборот.

Также попробуйте добавить @JvmStatic к каждому из ваших методов в классе Converters.

@TypeConverter
@JvmStatic
    fun toBonusList(bonusElements: String?): List<Bonus> {
        if (bonusElements == null) {
            return null
        }
        val gson = Gson()
        return gson.fromJson(bonusElements, Array<Bonus>::class.java).asList()
    }
...