有什么方法可以从Map中的Firestore检索数据。我正在尝试,但返回null 这是我的代码
docRef = db.collection("Buses").document("Bus1");
Button btn=view.findViewById(R.id.submit);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
bus=documentSnapshot.getData();
}
});
if (!bus.get("ID").toString().matches(busId)) {
DocumentReference reference = db.collection("Buses").document("Bus2");
reference.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
bus=documentSnapshot.getData();
}
});
}
if (bus!=null){
Toast.makeText(getContext(), "Data read Successfully", Toast.LENGTH_SHORT).show();
Intent intent=new Intent(getContext(),MapsActivity.class);
startActivity(intent);
CONSTANTS.bus=HomeFragment.this.bus;
getActivity().finishAffinity();
}
else{
Toast.makeText(getContext(), "Data read Failed", Toast.LENGTH_SHORT).show();
}
}
});
但是我在这里得到NullPointerException
这是数据库的屏幕截图
我不明白为什么getdata
函数返回null
这是错误日志
java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.Map.get(java.lang.Object)' on a null object reference
at
com.integratedsoftsols.fyp.bustracking.user.HomeFragment$1.onClick(HomeFragment.java:53)
at android.view.View.performClick(View.java:6274)
at android.view.View$PerformClick.run(View.java:24859)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6710)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)
答案 0 :(得分:1)
由于数据库查询是异步的并且在查询完成之前立即返回,因此您将获得null。服务器执行查询时,代码将继续执行,然后在查询完成后的一段时间后调用提供给addOnSuccessListener
的回调。
这样,在查询完成之前,在之前执行了记录结果的代码行,并且bus
具有您期望的值。如果您在回调中(而不是在回调之后)在getData
之后的立即行中添加日志记录,您将明白我的意思。
您的代码将必须考虑数据库调用的异步性质。在查询完成之前,您将无法使用bus
。
答案 1 :(得分:1)
docRef = db.collection("Buses").document("Bus1");
Button btn=view.findViewById(R.id.submit);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
bus=documentSnapshot.getData();
if (!bus.get("ID").toString().matches(busId)) {
DocumentReference reference = db.collection("Buses").document("Bus2");
reference.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
bus=documentSnapshot.getData();
}
});
}
if (bus!=null){
Toast.makeText(getContext(), "Data read Successfully", Toast.LENGTH_SHORT).show();
Intent intent=new Intent(getContext(),MapsActivity.class);
startActivity(intent);
CONSTANTS.bus=HomeFragment.this.bus;
getActivity().finishAffinity();
}
else{
Toast.makeText(getContext(), "Data read Failed", Toast.LENGTH_SHORT).show();
}
}
});
}
});
尝试