java - 如何遍历 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()来确保你的监听器只被调用一次。
其次,您不应该尝试将这样的异步调用转换为同步调用。代码的其他部分需要数据库查询的结果,它们应该通过回调而不是函数返回值来接收。你必须弄清楚你想如何在你的应用程序中进行异步编程,并按照你认为合适的方式进行连接。
推荐阅读
- goto - 如何在没有 goto 的情况下基本编程,但计算时间也不短
- java - 我应该如何在 springboot async 中使用 CompletableFuture 作为 void 方法
- java - 在线程“主”org.openqa.selenium.WebDriverException 中获取异常:无法解析远程响应:需要授权
- php - 在 Shopify 资产 API Laravel 中获取空白值以检索主题的单个资产
- java - 在 EDT 线程中,Swing JFrame 组件未在框架中绘制,即框架为空,但框架在主线程中成功绘制
- arrays - 我应该在 if() 中放入什么条件来计算数组中的所有正整数?
- mdriven - MDriven Turnkey 中是否有页面加载挂钩?
- redirect - Netlify + Nuxt - 删除尾部斜杠
- javascript - 使用 Service Worker 进行服务器 API 版本控制
- google-apps-script - Google 表格脚本 - 复制和清除