如何遍历 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循环。

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

addValueEventListener()是异步的,并立即返回。您传递给它的侦听器将在一段时间后最终知道结果时被调用。这意味着您将返回一个最初为空的templates。如果在函数返回后内容在不可预测的时间更新,那么无论谁持有templates,都可能会大吃一惊。不仅如此,随着时间的推移,内容将继续变化,因为您的侦听器被调用,每次更改到debatesChildren表示的位置。这是一个非常可怕的情况。

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

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

相关内容

最新更新