首页 > 解决方案 > 如何遍历 Firebase 孩子的孩子并将他们的键添加到列表中?

问题描述

所以我有一个 Firebase 实时数据库,它有一个孩子,下面有孩子。我想遍历孩子并将孩子的键添加到列表中。

这就是我正在做的事情:

public ArrayList<String> debateKeys() {
    debatesChildren.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
                tempItems.add(postSnapshot.getKey());
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
    return tempItems;
}

当我使用调试器时,它显示tempItems什么都不返回,onDataChange甚至不执行,这意味着它甚至不运行 for 循环。

我如何浏览孩子的孩子并将他们的钥匙添加到列表中?

标签: javaandroidfirebasefirebase-realtime-database

解决方案


addValueEventListener() 是异步的并立即返回。当最终知道结果时,您传递给它的侦听器将在一段时间后被调用。这意味着您将返回一个最初为空的templates. templates如果函数返回后内容在不可预测的时间更新,那么坚持下去的人可能会感到惊讶。不仅如此,内容将随着时间的推移而不断变化,因为您的侦听器会在每次更改debatesChildren. 这是一个非常可怕的情况。

首先,如果你只需要访问一次数据,你应该使用addListenerForSingleValueEvent()来确保你的监听器只被调用一次。

其次,您不应该尝试将这样的异步调用转换为同步调用。代码的其他部分需要数据库查询的结果,它们应该通过回调而不是函数返回值来接收。你必须弄清楚你想如何在你的应用程序中进行异步编程,并按照你认为合适的方式进行连接。


推荐阅读