【问题标题】:Firebase querying complete eventFirebase 查询完成事件
【发布时间】:2018-04-26 17:05:36
【问题描述】:

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

                            }
                        })
                    }
                })
            })
        }
    })

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

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

提前致谢。

【问题讨论】:

  • 那么基本上是什么问题,您尝试在onDataChange 函数之外使用hostList 并且是空的?
  • 是的,这是主要问题。我不能在onDataChanged 之外使用这个列表,因为我不知道数据是否被完全提取。

标签: firebase firebase-realtime-database kotlin


【解决方案1】:

发生这种情况是因为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 类似。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2016-06-09
    • 2020-04-23
    • 2016-11-24
    • 2021-03-23
    相关资源
    最近更新 更多