【问题标题】:TypeConverters - How to save array of objects to database?TypeConverters - 如何将对象数组保存到数据库?
【发布时间】:2020-01-10 21:42:46
【问题描述】:

我的 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 添加到我的 AppDatabase 类中

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

编译它说我:

类被引用为转换器,但它没有任何转换器 方法。

代码有什么问题?

【问题讨论】:

  • 您的 toOptionValuesList(...) 方法是否旨在作为方法 fromBonusList(...) 的补充?还是它们完全不相关?
  • @Christilyn:现在应该以正确的方式编写 :)

标签: android kotlin android-sqlite typeconverter


【解决方案1】:

您的toBonusList(...) 方法必须在Converters 类中返回List&lt;Bonus&gt;,因为您将bonus_value 作为List&lt;Bonus&gt; 存储在数据类中。

类型转换器必须有对应的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()
    }

【讨论】:

  • 您的代码有问题:发现:List 预期:List
  • Array::class.java 或 Array::class.java?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 2017-06-22
  • 2022-08-16
相关资源
最近更新 更多