如何从地图的Firestore中检索数据

时间:2020-07-31 19:49:06

标签: java android database firebase google-cloud-firestore

有什么方法可以从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 这是数据库的屏幕截图

strong text

我不明白为什么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)

2 个答案:

答案 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();
        }
        }
    });


    }
});

尝试