2016-01-12 13 views
6

यदि मेरे पास मेरे फायरबेस संदर्भ में संग्रहीत 50,000 आइटमों की एक सूची है, और क्लाइंट ऑनलाइन और सुनने के आखिरी बार से 5 आइटम उस सूची में जोड़े गए हैं, तो मुझे किस कॉलबैक का उपयोग करना होगा कि यह केवल 5 नई वस्तुओं के लिए ट्रिगर किया गया है जो जोड़ा गया है?फायरबेस ऑन चाइल्ड नए डेटा के लिए जोड़ा गया

मेरे पास ऑफ़लाइन दृढ़ता है मेरे क्लाइंट पर Firebase.getDefaultConfig().setPersistenceEnabled(true); के साथ। मेरे पास संदर्भ में जोड़े गए बच्चों के लिए एक गतिविधि सुनने के लिए एक श्रोता है। प्रत्येक बार गतिविधि बनाई जाती है onChildAdded संदर्भ में सभी डेटा के लिए बुलाया जाता है। क्या onChildAdded और onChildRemoved को अपने स्थानीय कैश और फायरबेस सर्वर पर डेटा के बीच केवल "diff" के लिए बुलाया जा सकता है? या यदि यह संभव नहीं है, तो फायरबेस से सबसे हालिया अपडेट के बाद केवल उन onChild* कॉलबैक को ट्रिगर करने के लिए?

+0

आप पहले से ही onComplete कॉलबैक का उपयोग कर की कोशिश की है:

long lastActive = new Date().getTime(); 

तो प्रत्येक आइटम और उसके बाद के लिए Firebase.ServerValue.TIMESTAMP के साथ एक timestamp जोड़ने [अपडेट()] के लिए (https://www.firebase.com/docs/web/api/firebase/update.html)? –

+0

एंड्रॉइड प्रलेखन से, ऐसा लगता है कि अपडेटChildren() setValue() के समान है। मैं नहीं जानता कि इसका उपयोग कैसे किया जा रहा है यह जानने के लिए कि मैं क्या करने की कोशिश कर रहा हूं। मैंने इस प्रश्न में एक उदाहरण जोड़ा है जो स्पष्ट हो सकता है कि मैं स्पष्ट करने की कोशिश कर रहा हूं। –

उत्तर

9

हर बार गतिविधि पर बनाया गया है संदर्भ में सभी डेटा के लिए बच्चे को जोड़ा जाता है। क्या यह संभव है कि चाइल्डएडड और ऑन चाइल्ड रीमेड को केवल मेरे स्थानीय कैश और फायरबेस सर्वर पर डेटा के बीच "diff" के लिए बुलाया जा सके?

नहीं, यह संभव नहीं है। से documentation on event types:

:

child_added हर बार प्रत्येक मौजूदा बच्चे के लिए एक बार शुरू हो रहा है और उसके बाद फिर से एक नया बच्चा अपने प्रारंभिक सवाल करने के लिए वापस निर्दिष्ट पथ में जोड़ा जाता है

अब

जो कॉलबैक मुझे इस तरह उपयोग करना होगा कि यह केवल 5 नई वस्तुओं के लिए ट्रिगर किया गया है जो जोड़े गए हैं?

होगा कि:

ref.limitToLast(5)... 

लेकिन इस की आवश्यकता है आप जानते हैं कि कितने आइटम सूची में जोड़ा गया, जब से तुम पिछले सुनी।

ref.orderByKey().startAt("-Ksakjhds32139")... 

फिर आप पिछले कुंजी रखना चाहते हैं:

अधिक सामान्य समाधान अंतिम आइटम आप पहले से ही देखा है का ट्रैक रखने के लिए और फिर startAt() का उपयोग जहां पिछले थे से घटनाओं फायरिंग शुरू करने के लिए है आपने साझा प्राथमिकताओं में देखा है।

इसी तरह आप पिछली बार गतिविधि के साथ दिखाई दे रही थी रख सकते हैं:

ref.orderByChild("timetstamp").startAt(lastActive+1)... 
+0

क्या यह समाधान बच्चे को भी प्रभावित करेगा चेंज और बच्चे की घटनाएं? –

+0

हालांकि फ्रैंक का जवाब बिल्कुल सही है, मुझे लगता है कि आपको CREATE, UPDATE और DELETE (उनके द्वारा सुझाए गए कार्यों के आधार पर) को संभालने के लिए तर्क पर पुनर्विचार करना चाहिए। मुझे लगता है कि विभिन्न डिवाइस ऑफलाइन होने पर होने वाली हर चीज को पकड़ने के लिए आप सी (आर) यूडी क्रियाओं (समाप्ति/निष्कासन तर्क के साथ) के फायरबेस आधारित फीफो पत्रिका पर विचार कर सकते हैं। – seanpj

+0

हां, आखिरी क्वेरी के बाद से घटनाओं का एक एफआईएफओ इष्टतम होगा, लेकिन ऐसा लगता है कि मैं एक बच्चे एवेन्ट लिस्टर का उपयोग करने जा रहा हूं। घटनाओं को कैप्चर करते समय, मैं उस डेटा को अनदेखा कर दूंगा जो इसे स्थानीय रूप से संग्रहीत करके देखा जा चुका है। –

1

आपको on('child_changed') का उपयोग करना चाहिए। आम तौर पर, on() किसी विशेष स्थान पर डेटा परिवर्तन सुनने के लिए उपयोग किया जाता है। हालांकि, on('child_changed') आपको सूचित करता

जब डेटा एक बच्चे में संग्रहीत (या उसके वंश के किसी भी) बदल जाता है।

यह कॉलबैक में डेटा स्नैपशॉट पास करेगा जिसमें नई बाल सामग्री शामिल है। ध्यान रखें कि एक child_changed घटना संभावित रूप से बच्चे में कई परिवर्तनों का प्रतिनिधित्व कर सकती है।

+2

क्या इस मामले में वह सभी 50000 + 5 आइटमों की एक सूची प्राप्त नहीं करेगा, वह 5 नहीं पूछ रहा है (प्रश्न का अंतिम अनुच्छेद देखें)। – seanpj

+1

आप सही हैं, मुझे लगता है कि वह अंतिम एक्स अपडेट किए गए बच्चों को प्राप्त करने के लिए [limitToLast (x)] (https://www.firebase.com/docs/web/api/query/limittolast.html) का भी उपयोग कर सकता है। –

संबंधित मुद्दे