会议室-在会议室中保存复杂对象

时间:2019-12-06 09:58:58

标签: android kotlin android-room

我有一个这样的TestData类:

data class TestData(
    @TypeConverters(TestDataConverter::class)
    var peripheral: BluetoothPeripheral,
    var isEnabled: Boolean
)

据我了解,要保存非原始对象,我必须使用Coverter。我是这样创建的:

class TestDataConverter {
    companion object {
        var gson = Gson()

        @TypeConverter
        @JvmStatic
        fun fromJson(json: String): BluetoothPeripheral {
            val type = object : TypeToken<BluetoothPeripheral>() {}.type
            return gson.fromJson(json, type)
        }

        @TypeConverter
        @JvmStatic
        fun toJson(peripheral: BluetoothPeripheral): String {
            val type = object: TypeToken<BluetoothPeripheral>() {}.type
            return gson.toJson(torrent, type)
        }
    }
}

我遇到错误:

 E/AndroidRuntime:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
        at com.google.gson.Gson.toJson(Gson.java:704)
        at com.google.gson.Gson.toJson(Gson.java:683)
        at com.google.gson.Gson.toJson(Gson.java:638)
        at c.room.TestDataConverter$Companion.toJson(TestDataConverter.kt:23)
        at c.room.TestDataConverter.toJson(Unknown Source:2)

如何成功存储此类复杂对象?有可能吗?

2 个答案:

答案 0 :(得分:0)

可能应该使用带有伴侣的类的静态类对象。当我第一次尝试Room。我有同样的问题。另外,您可以将@TypeConverters添加到您的实体,而不是字段。

@TypeConverter
object BluetoothPeripheral TypeConverter {
  @JvmStatic
  fun toJson(): String? { ... }

  @JvmStatic
  fun fromJson(): BluetoothPeripheral { ... }
}

答案 1 :(得分:0)

我认为使用转换器的重点是用原始类型表示我们的数据,因为SQLite仅支持几种类型。在这里,您尝试将对象转换为String / TEXT。转换器逻辑是正确的,但是类 BluetoothPeripheral 可能包含(我不确定,因为您未提供定义)嵌套对象,因此转换器不知道如何将它们转换为字符串