这是我在Firebase上传的模型:
public class OnlineMatch{
private User user1;
private User user2;
public OnlineMatch(User firstPlayer, User secondPlayer) {
this.user1 = firstPlayer;
this.user2 = secondPlayer;
}
}
然后我以这种方式将数据发送到Firebase(kotlin):
fun createMatch(match: OnlineMatch) {
val matchList = database.child("multiplayer").push()
matchList.setValue(match)
}
因此,我的数据库结构如下:
如果我扩展节点,我可以完美地看到我的对象:OnlineMatch(User1,User2)
现在我想查询数据库并获取一个ArrayList'<'OnlineMatch'>'。 我已经找到了Firebase文档,但我发现没什么用处。 我能怎么做?提前谢谢。
答案 0 :(得分:4)
您没有找到有用的内容,因为当您查询Firebase数据库时,您会得到Map
而不是ArrayList
。 Firebase中的所有内容都是按键和值组成的。对Firebase而言,使用ArrayList
是一种反模式。 Firebase建议不要使用数组的原因之一是它使安全规则无法编写。
在Kotlin
中,不需要getter和setter。确实在幕后存在这些函数,但不需要明确定义它们。要设置这些字段,您可以使用以下代码:
val onlineMatch = OnlineMatch() //Creating an obect of OnlineMatch class
onlineMatch.user1 = userObject //Setting the userObject to the user1 field of OnlineMatch class
//onlineMatch.setUser(userObject)
正如您可能看到我已评论最后一行,因为无需使用setter来设置userObject
。
非常重要的是,不要忘记在the no argument constructor
课程中添加OnlineMatch
Firebase所需的课程。
public OnlineMatch() {}
修改强>
要实际获取数据,只需将侦听器放在所需节点上,然后将数据从dataSnapshot
对象导出到HashMap中。
val map = HashMap<String, OnlineMatch>()
然后简单地迭代HashMap
,如下所示:
for ((userId, userObject) in map) {
//do what you want with them
}
或者只需使用以下代码:
val rootRef = firebase.child("multiplayer")
rootRef.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(error: FirebaseError?) {
println(error!!.message)
}
override fun onDataChange(snapshot: DataSnapshot?) {
val children = snapshot!!.children
children.forEach {
println(it.toString())
}
}
})
希望它有所帮助。