如何遍历Firebase孩子的孩子并将他们的钥匙添加到列表中?

时间:2018-12-31 02:44:22

标签: java android firebase firebase-realtime-database

因此,我有一个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循环。

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

1 个答案:

答案 0 :(得分:4)

addValueEventListener()是异步的,并立即返回。传递给它的侦听器将在一段时间后最终知道结果时被调用。这意味着您将返回最初为空的templates。如果并且在函数返回后的某个不可预知的时间更新内容时,坚持使用templates的人可能会感到惊讶。不仅如此,随着您的收听者每次对debatesChildren所代表的位置进行每次更改时,内容都会随着时间的推移而不断变化。这是一个非常糟糕的情况。

首先,如果只需要访问一次数据,则应使用addListenerForSingleValueEvent()以确保您的侦听器仅被调用一次。

第二,您不应尝试将类似的异步调用转换为同步调用。代码的其他部分需要数据库查询的结果,它们应该通过回调而不是通过函数返回值来接收该结果。您将必须弄清楚如何在应用中进行异步编程,并根据需要进行连接。