Android 在SQLite数据库中将自定义对象保存为JSON
我不太熟悉使用json的数据存储。我有一个非常复杂的对象,它基本上只是一个hashmap,请参见以下内容: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()) 但唯一相关的一列是最后一列,列
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}]}}