【问题标题】:How to retrieve the data from firestore in maps如何从地图中的firestore检索数据
【发布时间】:2020-11-21 16:20:21
【问题描述】:

有什么方法可以从 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(), "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)

【问题讨论】:

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


    【解决方案1】:

    因为数据库查询是异步的并且在查询完成之前立即返回,所以您将得到 null。当服务器执行查询时,您的代码会继续执行,然后您提供给addOnSuccessListener 的回调会在一段时间后被调用,只要查询完成。

    因此,您记录结果的代码行正在执行查询完成并且bus 具有您期望的值。如果你在getData 之后的立即行添加日志记录,在回调中(不是在回调之后),你会明白我的意思。

    您的代码必须考虑数据库调用的异步特性。在查询完成之前,您将无法使用bus

    【讨论】:

      【解决方案2】:
          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();
              }
              }
          });
      
      
          }
      });
      

      试试这个

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-07
        • 1970-01-01
        • 2021-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多