英文:
How to retrieve the data from firestore in maps
问题
以下是您提供的代码的翻译部分:
有没有办法从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(), "数据读取成功", Toast.LENGTH_SHORT).show();
Intent intent=new Intent(getContext(),MapsActivity.class);
startActivity(intent);
CONSTANTS.bus=HomeFragment.this.bus;
getActivity().finishAffinity();
}
else{
Toast.makeText(getContext(), "数据读取失败", Toast.LENGTH_SHORT).show();
}
}
});
但我在这里得到了NullPointerException
错误
这是数据库的截图
我不明白为什么getdata
函数返回null
这是错误日志
java.lang.NullPointerException: 尝试在空对象引用上调用接口方法 'java.lang.Object java.util.Map.get(java.lang.Object)'
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)
英文:
Is there any way to retrieve the data from firestore in Maps. I am trying but its returning null
here is my code
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();
}
}
});
But I am getting NullPointerException
here
Here is the screenshot of the database
I am not getting i why getdata
function is returning null
Here is the error log
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)
答案1
得分: 1
你之所以得到null是因为数据库查询是异步的,会立即返回,而不会等待查询完成。你的代码会继续执行,而服务器则在执行查询,然后在查询完成时调用你提供给addOnSuccessListener
的回调函数。
因此,在你记录结果的那行代码被执行时,查询尚未完成,bus
还没有你期望的值。如果你在getData
之后的立即行添加日志记录,而不是在回调之后,你会明白我的意思。
你的代码需要考虑到数据库调用的异步性质。在查询完成后,才能使用bus
。
英文:
You are getting null because the database query is asynchronous and returns immediately, before the query is complete. Your code continues to execute while the server performs the query, then the callback you provide to addOnSuccessListener
is invoked some time later, whenever the query is complete.
As such, the line of code where you log the result is being executed before the query is complete and bus
has the value you expect. If you add logging at the line immediately after getData
, within the callback (not after the callback), you will see what I mean.
Your code will have to account for the asynchronous nature of the database calls. You won't be able to use bus
until after the query completes.
答案2
得分: 0
Sure, here is the translated code:
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();
}
}
});
}
});
try this
Please note that I have translated the code, but the code itself remains the same.
英文:
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();
}
}
});
}
});
try this
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论