java - शुरुआती डेटा को कैसे छोड़ें और फायरस्टार फायरबेस में केवल नए अपडेट को ट्रिगर करें?




android firebase (2)

मैंने हर जगह बिना किसी भाग्य के खोज की है। मैं सभी उपयोगकर्ताओं को प्राप्त करने के लिए फायरस्टार को क्वेरी करना चाहता हूं, जहां प्रकार व्यवस्थापक है। कुछ इस तरह:

SELECT * FROM users WHERE type=admin

लेकिन केवल जब संपत्ति total बदल रही है। अगर मैं उपयोग कर रहा हूँ:

users.whereEqualTo("type", "admin").addSnapshotListener(new EventListener<QuerySnapshot>() {
    @Override
    public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirebaseFirestoreException e) {
        for (DocumentChange dc : snapshots.getDocumentChanges()) {
            switch (dc.getType()) {
                case ADDED:
                    //Not trigger
                    break;
                case MODIFIED:
                    //Trigger
                    break;
                case REMOVED:
                    //
                    break;
            }
        }
    }
});

जब मैं क्वेरी करता हूं तो ADDED को पहली बार ट्रिगर किया जाता है और जब total case MODIFIED बदला जाता case MODIFIED को फिर से ट्रिगर किया जाता है (यह वही है जो चाहते हैं)। मैं केवल परिवर्तन चाहता हूं और सभी प्रारंभिक डेटा नहीं, मुझे इसकी आवश्यकता नहीं है। इसे कैसे प्राप्त करें?

कृपया मेरी मदद करें, मेरे प्रोजेक्ट का आखिरी हिस्सा है। कैसे छोड़ें case ADDED ?


जब आप रियलटाइम परिवर्तन के लिए क्लाउड addSnapshotListener() में बदलावों के बारे में सुन रहे हैं, तो addSnapshotListener() क्वेरी के addSnapshotListener() विधि का उपयोग करके, यह:

इस क्वेरी को सुनना शुरू करता है।

जिसका मूल रूप से मतलब है कि पहली बार जब आप श्रोता को संलग्न करते हैं, तो आपको सभी दस्तावेज़ मिलते हैं जो उस विशेष क्वेरी के अनुरूप होते हैं। इसके अलावा, हर बार एक दस्तावेज़ में एक संपत्ति बदल जाती है, आपको उस परिवर्तन के अनुसार सूचित किया जाता है। जाहिर है, यह केवल तभी हो रहा है जब श्रोता सक्रिय रहे और उसे हटाया न जाए।

दुर्भाग्य से, फायरस्टार के श्रोता उस तरह से काम नहीं करते हैं, इसलिए आप उस "केस एडेड" को छोड़ नहीं सकते हैं। इसके बजाय आप क्या कर सकते हैं, प्रत्येक उपयोगकर्ता ऑब्जेक्ट के तहत एक Date संपत्ति जोड़ना है ( this है कि आप इसे कैसे जोड़ सकते हैं) और क्लाइंट पर अपने डेटाबेस को क्वेरी करें, इस नई संपत्ति के अनुसार, उन सभी दस्तावेजों के लिए जो पिछले समय से बदल गए हैं।

निक कार्डसो की टिप्पणी के अनुसार, भविष्य के आगंतुकों के लिए पूछ सकते हैं कि यह व्यवहार क्यों होता है, ऐसा इसलिए है क्योंकि उन्होंने अपनी टिप्पणी में उल्लेख किया है। मैं एक बेहतर समझ के लिए, इस post से डौग स्टीवेन्सन का जवाब देखने की सलाह देता हूं।


यहाँ मेरे लिए एक समाधान काम कर रहा है: उपयोग

AtomicBoolean isFirstListener = new AtomicBoolean(true);

और फिर घटना विधि पर

if (isFirstListener.get()) {
                    isFirstListener.set(false);
                    //TODO Handle the entire list. 
                    return;
                }

यहाँ मेरी परियोजना से एक नमूना कोड है:

 final AtomicBoolean isFirstListener = new AtomicBoolean(true);
 mDb.collection("conversation_log").document(room_id).collection("messages").orderBy("sent_at")
    .addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(@Nullable QuerySnapshot value2, @Nullable FirebaseFirestoreException e) {
        if (isFirstListener.get()) {
            isFirstListener.set(false);
            //TODO Handle the entire list.
            return;
        }
    }
});

संदर्भ: answer





google-cloud-firestore