Android 在SQLite数据库中将自定义对象保存为JSON

Android 在SQLite数据库中将自定义对象保存为JSON,android,kotlin,gson,Android,Kotlin,Gson,我不太熟悉使用json的数据存储。我有一个非常复杂的对象,它基本上只是一个hashmap,请参见以下内容: data class Axis (var BSSID: String, var RSSI: Int) data class Label (var x: Int, var y: Int) data class RadioMap(var map: HashMap<Label, ArrayList<Axis>> = HashMap()) 但唯一相关的一列是最后一列,列

我不太熟悉使用json的数据存储。我有一个非常复杂的对象,它基本上只是一个hashmap,请参见以下内容:

data class Axis (var BSSID: String, var RSSI: Int)
data class Label (var x: Int, var y: Int)

data class RadioMap(var map: HashMap<Label, ArrayList<Axis>> = HashMap())
但唯一相关的一列是最后一列,列\u RADIO\u MAP\u JSON

下面是我试图保存的RadioMap的一个示例,其中调用了
toString()

无线电地图{Label(x=0,y=0)=[Axis(BSSID=78:f2:9e:57:0d:03, RSSI=-93),轴(BSSID=78:f2:9e:57:0d:04,RSSI=-92), 轴(BSSID=78:f2:9e:57:0d:01,RSSI=-92),轴(BSSID=78:f2:9e:57:0d:00, RSSI=-91),轴(BSSID=78:f2:9e:57:0d:02,RSSI=-91), 轴(BSSID=54:be:f7:dc:47:ea,RSSI=-90),轴(BSSID=10:5f:06:83:f1:c5, RSSI=-90),轴(BSSID=2c:7e:81:c4:70:ee,RSSI=-89), 轴(BSSID=10:da:43:86:9b:51,RSSI=-89),轴(BSSID=4e:7e:81:c4:70:ee, RSSI=-89),轴(BSSID=7e:8f:e0:0a:b6:d5,RSSI=-89), 轴(BSSID=3e:7e:81:c4:70:ee,RSSI=-88),轴(BSSID=1c:49:7b:94:92:e1, RSSI=-88),轴(BSSID=84:00:2d:65:a0:ba,RSSI=-88), 轴(BSSID=50:c7:bf:89:13:f6,RSSI=-87),轴(BSSID=3e:7e:81:c4:70:ed, RSSI=-87),轴(BSSID=ea:5d:df:92:49:28,RSSI=-86), 轴(BSSID=da:5d:df:92:49:28,RSSI=-84),轴(BSSID=54:be:f7:dc:47:e8, RSSI=-76),轴(BSSID=78:f2:9e:57:0c:fa,RSSI=-73), 轴(BSSID=78:f2:9e:57:0c:f8,RSSI=-70),轴(BSSID=44:32:c8:2c:77:b2, RSSI=-54),轴(BSSID=46:32:c8:2c:77:b4,RSSI=-53), 轴(BSSID=d4:5d:df:31:e4:20,RSSI=-51),轴(BSSID=d4:5d:df:31:e4:24, RSSI=-51),轴(BSSID=d4:5d:df:31:e4:1d,RSSI=-48), 轴(BSSID=d4:5d:df:31:e4:18,RSSI=-42),轴(BSSID=d4:5d:df:31:e4:1e, RSSI=-42),轴(BSSID=d4:5d:df:31:e4:1a,RSSI=-41), 轴(BSSID=d4:5d:df:31:e4:1b,RSSI=-40)])

下面是存储在数据库中的rmString示例:

fun updateRadioMap(name: String, radioMap: RadioMap) {
    val gson = Gson()
    val rmString = gson.toJson(radioMap)
    val cv = ContentValues()
    cv.put(COLUMN_RADIO_MAP_JSON, rmString)
    val db = writableDatabase
    db.update(TABLE_FLOOR_MAPS, cv, "$COLUMN_FLOOR_NAME = '$name'", null)
    db.close()
}

fun getRadioMap(name: String): RadioMap {
    val db = this.writableDatabase
    val query = "SELECT * FROM $TABLE_FLOOR_MAPS WHERE $COLUMN_FLOOR_NAME =\"$name\";"
    val cursor = db.rawQuery(query, null)

    return if (cursor != null && cursor.moveToFirst()) {
        var rmString = cursor.getString(5)
        cursor.close()
        db.close()
        if (rmString != null) {
            val gson = Gson()
            gson.fromJson<RadioMap>(rmString, RadioMap::class.java) //APP CRASHES HERE
        } else {
            RadioMap()
        }
    } else {
        cursor.close()
        db.close()
        RadioMap()
    }
}
{"map":{"Label(x\u003d0, y\u003d0)":
[{"BSSID":"10:da:43:84:cb:75","RSSI":-92},
{"BSSID":"52:86:8c:2f:0f:7d","RSSI":-91},
{"BSSID":"78:f2:9e:57:0d:00","RSSI":-90},
{"BSSID":"78:f2:9e:57:0d:04","RSSI":-90},
{"BSSID":"2c:7e:81:c4:70:ed","RSSI":-89},
{"BSSID":"10:da:43:86:9b:51","RSSI":-88},
{"BSSID":"ae:8f:e0:0a:b6:d5","RSSI":-88},
{"BSSID":"40:b0:34:79:75:0f","RSSI":-88},
{"BSSID":"a4:2b:8c:d3:02:4b","RSSI":-88},
{"BSSID":"9e:8f:e0:0a:b6:d5","RSSI":-87},
{"BSSID":"ee:5d:df:92:49:28","RSSI":-87},
{"BSSID":"d4:5d:df:31:e4:1e","RSSI":-47},
{"BSSID":"d4:5d:df:31:e4:18","RSSI":-42}]}}
编辑2:

我将rmString放入JSON验证器,它是有效的JSON,无论是在我将其插入数据库之前还是在我将其取出之后。因此,出于某种原因,gson.fromJson(rmString,RadioMap::class.java)无法将有效的json转换回我的对象。我认为这与RadioMap对象的设置方式有关


数据类RadioMap()是否应以不同方式执行?

对象图未正确反序列化,因为您使用了复合对象(
标签
)作为映射键。没有标准的方法将此类映射表示为JSON数据结构。

在CREATE TABLE Sqlite命令中,RadioMap列的类型是什么
TEXT
?@Naetmul正确,它是TEXT似乎您必须使用
gson.toJson(对象,类型)
而不是
gson.toJson(对象)
@Naetmul我刚刚尝试了这个,但仍然得到相同的错误请与一些示例数据共享您的表结构。
{"map":{"Label(x\u003d0, y\u003d0)":
[{"BSSID":"10:da:43:84:cb:75","RSSI":-92},
{"BSSID":"52:86:8c:2f:0f:7d","RSSI":-91},
{"BSSID":"78:f2:9e:57:0d:00","RSSI":-90},
{"BSSID":"78:f2:9e:57:0d:04","RSSI":-90},
{"BSSID":"2c:7e:81:c4:70:ed","RSSI":-89},
{"BSSID":"10:da:43:86:9b:51","RSSI":-88},
{"BSSID":"ae:8f:e0:0a:b6:d5","RSSI":-88},
{"BSSID":"40:b0:34:79:75:0f","RSSI":-88},
{"BSSID":"a4:2b:8c:d3:02:4b","RSSI":-88},
{"BSSID":"9e:8f:e0:0a:b6:d5","RSSI":-87},
{"BSSID":"ee:5d:df:92:49:28","RSSI":-87},
{"BSSID":"d4:5d:df:31:e4:1e","RSSI":-47},
{"BSSID":"d4:5d:df:31:e4:18","RSSI":-42}]}}