首先,我是Firebase数据库的新手。我需要做的是做一些调用,以获取一些数据。我能够得到这样的数据。
val query = mDatabaseReference
?.child("Node1")
?.child("Node1_id")
val hostList = mutableListOf<Class>()
query?.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(databaseError: DatabaseError) {}
override fun onDataChange(dataSnapshot: DataSnapshot) {
dataSnapshot.children.forEach({ node1Details ->
val hostDetailsQuery = mDatabaseReference
?.child("Node1Details")
?.child(node1Details.key)
hostDetailsQuery?.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(databaseError: DatabaseError) {
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
val host = dataSnapshot.getValue(MyClass::class.java)
val ratingQuery = mDatabaseReference
?.child("Rating")
?.child(node1Details.key)
?.child(id)
ratingQuery?.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(databaseError: DatabaseError) {
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
host?.myRating = if (dataSnapshot.value == null) 0 else (dataSnapshot.value as Long).toInt()
hostList.add(host!!)
}
})
}
})
})
}
})
我不知道如何解决是等到所有调用完成后调用特定方法。
希望我很清楚,希望有人可以帮助我。
提前致谢。
答案 0 :(得分:0)
这种情况正在发生,因为onDataChange()
函数具有异步行为,这意味着甚至在您尝试将这些对象添加到hostList
之前就会调用它。换句话说,当您尝试使用onDataChange()
函数之外的列表时,数据尚未从数据库中完成加载,这就是列表始终为空的原因。
您可以通过两种方式解决此问题。一种方法是仅在onDataChange()
函数内声明和使用列表,如下所示:
ratingQuery?.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(databaseError: DatabaseError) {}
override fun onDataChange(dataSnapshot: DataSnapshot) {
val hostList = mutableListOf<Class>()
host?.myRating = if (dataSnapshot.value == null) 0 else (dataSnapshot.value as Long).toInt()
hostList.add(host!!)
//Do what you want with your list
}
})
第二种方法是创建自己的回调以等待Firebase返回数据,为此我建议您从 post 中查看我的回复的最后一部分另请查看 video 。答案是用Java编写的,但与Kotlin相似。