android - 将对象添加到 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")
解决方案
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 中的数组。
推荐阅读
- c# - 使用 Dotnet Core 和 React js 为身份服务器 4 添加自定义登录/注册 Api
- python - 如何从文本中提取所有可能的名词短语
- reactjs - 如何在 onchange 中仅传递字符串而不是整个事件?
- javascript - 尝试使用 javascript 在终端中记录 JSON 响应
- ios-simulator - xcode模拟器可以用来代替bluestacks吗
- python-sockets - 使python socket recv更快的方法?
- oat++ - 在 centos 7 上安装 OAT++ 失败
- javascript - 如何使用 express-validator(版本 6.6.1)明智地验证字段条件
- javascript - 如何使用 Jasmine 测试嵌套的 ng-click
- animation - SwiftUI:NavigationView 中的显式动画损坏?