首页 > 解决方案 > 将对象添加到 firebase 实时数据库列表会将其转换为 HashMap。如何将其保留为列表或转换它

问题描述

我向 firebase 实时数据库添加了一个 JSON,当我检索到它时,一切都很顺利,直到我通过应用程序向列表中添加了一个新元素,并将其转换为 Hashmap。

我怎样才能将其保留为列表。

 override fun onDataChange(p0: DataSnapshot) {

    val database = p0.getValue(ListOfGamesJavaModel::class.java)!!
    val lastUpdate = database.date
}

在我将新元素添加到列表之前,这很好用

val newGameRef = database.child("gamesList")
    newGameRef.child(System.currentTimeMillis().toString()).setValue(game)
    database.child("date").setValue("23-08-2019 20:32")

之后,当我运行代码来检索列表时,我得到了这个错误。

com.google.firebase.database.DatabaseException:反序列化时需要一个列表,但得到一个类 java.util.HashMap

你能帮我把它作为一个列表检索吗

在职的

数据库 - 工作

不工作

数据库 - 不 - 工作

更新

如果我像这样添加它,它可以工作,但我试图在不知道列表大小的情况下添加一个新的。

val newGameRef = database.child("gamesList")
    newGameRef.child(int.toString()).setValue(game)
    database.child("date").setValue("23-08-2019 20:32")

标签: androidfirebasefirebase-realtime-databasekotlin

解决方案


Firebase 实时数据库始终将数据存储为键值对,键是字符串。在 Java 中,这转换为Map<String,Object>. 在某些情况下,Firebase 客户端能够自动将数据转换为数组,List<Object>在您的情况下转换为数组。但是在您的第二个 JSON 屏幕截图中,客户端不会自动将数据转换为 a List,因此您必须自己执行此操作。

正如康斯坦丁评论的那样,首先Map<String, ...>从数据库中获取值,然后从中获取值列表。

override fun onDataChange(p0: DataSnapshot) {
    val map = p0.getValue(MapOfGamesJavaModel::class.java)!!
    val database = map.values
    val lastUpdate = database.date
}

MapOfGamesJavaModel是您必须创建的新课程。或者,您可以阅读Map<String, GamesJavaModel>,但在这种情况下,您可能必须使用泛型类型进行一些转换。

要详细了解 Firebase 实时数据库处理数组的方式,请参阅最佳实践:Firebase 中的数组


推荐阅读