java - 来自 Firebase 实时数据库的 equalTo 数据快照返回空值
问题描述
当用户启动活动时,应该弹出一个包含父节点的 Toast,其中“drinkManufacturerID”的值等于给定的字符串。但是,在 Toast 中返回了一个空值。
相关代码:
public class DealRawDataActivity extends AppCompatActivity {
DatabaseReference databaseDrinks;
String keys;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_deal_raw_data);
databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn");
databaseDrinks.orderByChild("drinkManufacturerID").equalTo("D1eY5v9guwSIWMvfLoq8xGywrT53").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot datas : dataSnapshot.getChildren()) {
keys = datas.getKey();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Toast.makeText(this, keys, Toast.LENGTH_LONG).show();
}
}
解决方案
当尝试在回调之外显示包含变量值的 Toast 消息时keys
,您总是会得到,null
因为它onDataChange()
具有异步行为。因为该方法立即返回,所以keys
您尝试显示的变量的值尚未从回调中填充。无法保证需要多长时间。因此,在数据可用之前可能需要几百毫秒到几秒钟。
快速解决此问题的方法是使用移动以下代码行:
Toast.makeText(this, keys, Toast.LENGTH_LONG).show();
在 for 循环结束之后,否则我建议您从这篇文章中查看我的 anwser 的最后一部分,其中我已经解释了如何使用自定义回调来完成它。您也可以观看此视频以更好地理解。
编辑:请看下面的整个代码:
public class DealRawDataActivity extends AppCompatActivity {
DatabaseReference databaseDrinks;
String keys;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_deal_raw_data);
databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn");
databaseDrinks.orderByChild("drinkManufacturerID").equalTo("D1eY5v9guwSIWMvfLoq8xGywrT53").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot datas : dataSnapshot.getChildren()) {
keys = datas.getKey();
}
Toast.makeText(this, keys, Toast.LENGTH_LONG).show(); //Should work!!
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
推荐阅读
- reactjs - 在 Redux 中操作后更改键
- node.js - 用于上传视频的 Vimeo api 节点返回错误“源对象可能只是此环境中 Buffer 或 Readable 的实例”
- java - X x = new X(); 之间的差异 和 x = 新 X();
- ios - 在不使用 init 的情况下模拟 URLSessionDataTask
- haskell - Haskell 中的种类以何种方式关联?
- reactjs - 如何使用 axios 拦截器自动刷新令牌
- c++ - C++ 中的初始化
- java - 无法使用 super 调用父接口的默认方法
- css - 如何在引导程序中拥有 100% 的剩余空间?
- c++ - 保存格式化文本 Qt 的文件