Firebase查询完整事件

时间:2018-04-24 13:30:13

标签: firebase firebase-realtime-database kotlin

首先,我是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!!)

                            }
                        })
                    }
                })
            })
        }
    })

我不知道如何解决是等到所有调用完成后调用特定方法。

希望我很清楚,希望有人可以帮助我。

提前致谢。

1 个答案:

答案 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相似。