【问题标题】:Firebase Firestore Data Query get calling two times?Firebase Firestore 数据查询被调用两次?
【发布时间】:2018-01-05 09:32:02
【问题描述】:

firebase_dynamicview() 该方法只被调用一次,但查询执行了两次。所以在这种情况下,我的 Activity 可以创建两次帮助我。

Log.d("gettingcall","2222222222 "); 正在打印此日志 两次

private void firebase_dynamicview() {
    shared_menueditor.clear().commit();
    shared_menueditor.putString("success", "failure");
    shared_menueditor.apply();
    shared_menueditor.commit();
    Log.d("gettingcall","11111111111   ");
    db = FirebaseFirestore.getInstance();
    Query query = db.collection("employees");
    registration=  query.whereEqualTo("UID", sharedPref.getString("userId",null)).addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
            if (e != null) {
            }
            if (documentSnapshots.isEmpty()){
                closeSplash();
            }
            Log.d("gettingcall","2222222222   ");
            for (DocumentChange documentChange : documentSnapshots.getDocumentChanges()) {
                Map<String, Object> forms =null;
                if (documentChange.getDocument().getData().get("mobileMenu") != null) {
                    try 
forms= (Map<String, Object>)documentChange.getDocument().getData().get("mobileMenu");
                    } catch (Exception e1) {
                        Log.e("Execeptionmenus","**   "+e1.toString());
                        e1.printStackTrace();
                    }
                }
                if (forms!= null) {
                    for (Map.Entry<String, Object> form : forms.entrySet()) {
                        String key = form.getKey();
                        if (key.contains("Attendance")) {
                            String keys = form.getKey();
                            Log.d("PrintisAttendance","****   "+forms.get(keys));
                            shared_menueditor.putString("isAttendance",""+forms.get(keys));
                        }if (key.contains("Calender")){
                            String keys = form.getKey();
                            shared_menueditor.putString("Calender",""+forms.get(keys));
                        }
                        if (key.contains("Expenses")){
                            String keys = form.getKey();
                            shared_menueditor.putString("Expenses",""+forms.get(keys));
                        }if (key.contains("Leaves")){
                            String keys = form.getKey();
                            shared_menueditor.putString("Leaves",""+forms.get(keys));
                        }if (key.contains("LogOut")){
                            String keys = form.getKey();
                            shared_menueditor.putString("LogOut",""+forms.get(keys));
                        }if (key.contains("NoticeBoard")){
                            String keys = form.getKey();
                            shared_menueditor.putString("NoticeBoard",""+forms.get(keys));
                        }if (key.contains("Tasks")){
                            String keys = form.getKey();
                            shared_menueditor.putString("Tasks",""+forms.get(keys));
                        }if(key.contains("TrackEmployee")){
                            String keys = form.getKey();
                            shared_menueditor.putString("TrackEmployee",""+forms.get(keys));
                        }
                        if (key.contains("Form")) {
                            Map<Object, Object> values = (Map<Object, Object>) form.getValue();
                            name = (String) values.get("wName");
                            String id = (String) values.get("WID");
                            if (key.contains("Form1")) {
                                editor.putString("nav_form1", name);
                                editor.putString("formId1",id);
                            }
                            if (key.contains("Form2")) {
                                editor.putString("nav_form2", name);
                                editor.putString("formId2",id);
                            }
                            if (key.contains("Form3")) {
                                editor.putString("nav_form3", name);
                                editor.putString("formId3",id);
                            }
                        }
                    }
                }
            }
            shared_menueditor.apply();
            shared_menueditor.commit();
            editor.apply();
            editor.commit();
            Log.d("calllliiiiiiing******","spalsh");
            userprofile();
       }
    });
}

【问题讨论】:

  • @Frank van Puffelen 先生,您能检查一下吗...
  • 当您调用addSnapshotListener() 时,它会为初始数据以及对该数据的后续更新附加一个侦听器。如果您只想获取一次数据,则应改为调用get()
  • @FrankvanPuffelen 它正在工作,谢谢您

标签: java android firebase google-cloud-firestore


【解决方案1】:

如果你想实时更新,请使用打击代码:

DocumentReference docRef = db.collection("cities").document("SF");
docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(@Nullable DocumentSnapshot snapshot,
                        @Nullable FirebaseFirestoreException e) {
        if (e != null) {
            Log.w(TAG, "Listen failed.", e);
            return;
        }

        if (snapshot != null && snapshot.exists()) {
            Log.d(TAG, "Current data: " + snapshot.getData());
        } else {
            Log.d(TAG, "Current data: null");
        }
    }
});

更多示例:https://firebase.google.com/docs/firestore/query-data/listen


如果你只想获取一次数据,你应该调用get()方法

db.collection("cities")
        .get()
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        Log.d(TAG, document.getId() + " => " + document.getData());
                    }
                } else {
                    Log.d(TAG, "Error getting documents: ", task.getException());
                }
            }
        });

更多示例:https://firebase.google.com/docs/firestore/query-data/get-data


注意:如何分离 firestore 监听器

db.collection("youcollectionname").document(paciente.getProfissionalResponsavel())
 .addSnapshotListener(MainActivity.this, new EventListener<DocumentSnapshot>() {

你需要更新

MainActivity.this 以匹配您的代码。

【讨论】:

  • onComplete 在这里运行两次。我不知道原因。
猜你喜欢
  • 1970-01-01
  • 2021-03-29
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多