फ़ायरबेस डेटाबेस उपयोगकर्ता जानते हैं कि डेटा सुनने के लिए दो मूल श्रोताओं हैं: ValueEventListener और ChildEventListener। जब हम एक वस्तु को सुनते हैं तो यह बहुत अच्छा काम करता है, लेकिन जब हम कुछ संग्रह सुनते हैं तो काफी मुश्किल हो जाता है।एंड्रॉइड में रीसाइक्लर व्यू के लिए ValueEventListener बनाम ChildEventListener
प्रश्न निर्दिष्ट करने के लिए, आइए कल्पना करें कि हमारे पास हैकरन्यूज फ़ीड है, और हम उदाहरण सुनते हैं। फायरबेस में "पोस्ट" ऑब्जेक्ट।
बेशक हमारे पास पोस्ट प्रदर्शित करने के लिए हमारे ऐप में रीसाइक्लर व्यू है और मुझे लगता है कि अच्छा विचार फ़ायरबेसयूआई का उपयोग करेगा, लेकिन समस्या यह है कि हम सर्वर पक्ष या परीक्षणों को बदलने के मामले में अधिक अमूर्त एप्लिकेशन बनाना चाहते हैं। तो हम कुछ एडाप्टर का उपयोग करेंगे, लेकिन यह एक और question है।
हम दो श्रोताओं के रूप में मैं उल्लेख किया है, सवाल यह है कि जो बेहतर है?
जब हम ValueEventListener का उपयोग करते हैं तो हमें पूरा संग्रह मिल जाएगा, लेकिन किसी भी बदलाव के मामले में, जैसे एक उपयोगकर्ता ने पोस्ट की सामग्री बदल दी है, हमें पूरे डेटा को फिर से लोड करना होगा, जिसका अर्थ है महंगे नेटवर्क स्थानांतरण के माध्यम से अधिक बाइट भेजना। एक और समस्या है जब हम उपयोगकर्ता multilisteners है, और यहाँ उदाहरण है:
पोस्ट userId है, लेकिन हम उसके नाम प्रदर्शित करना चाहते हैं, तो
onDataChanged
विधि में हम उपयोगकर्ता डेटा लाने की है, इस तरह:postsReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot data : dataSnapshot.getChildren()) { Post post = data.getValue(Post.class); usersReference.child(post.getUserId()).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // Here we have user data } @Override public void onCancelled(FirebaseError firebaseError) { } }); } } @Override public void onCancelled(FirebaseError firebaseError) { } });
आप देख सकते हैं कि अब हमें प्रत्येक पोस्ट को रीसाइक्लिंग व्यू में अलग-अलग जोड़ना होगा, जो हमें सुराग देगा कि शायद हमें चाइल्डवेन्ट लिस्टर का उपयोग करना चाहिए।
तो अब जब हम ChildEventListener का उपयोग करते हैं तो समस्या समान होती है - हमें प्रत्येक पोस्ट को रीसाइक्लिंग व्यू में अलग से जोड़ना होगा, लेकिन जब कोई पोस्ट सामग्री बदलता है, तो फायरबेस हमें केवल एक ही पोस्ट भेजता है, जिसका अर्थ है नेटवर्क के माध्यम से कम डेटा।
हम रीसाइक्लिंग व्यू को अलग से पोस्ट जोड़ने को पसंद नहीं करते हैं, क्योंकि उदाहरण: - लोडिंग सूचक जोड़ने में मुश्किल है, क्योंकि हम नहीं जानते कि सभी डेटा कब आता है। - उपयोगकर्ताओं को लगातार ताज़ा दृश्य मिलता है, जबकि नई सूचियों की बजाय नई पोस्ट दिखाई देती है। - उस संग्रह को सॉर्ट करना मुश्किल है, हमें शायद एडाप्टर में ऐसा करना होगा।
प्रश्न
की तुलना में मैं ऊपर लिखा था क्या संग्रह के साथ firebase उपयोग की सर्वोत्तम प्रथाएँ, और शायद बेहतर समाधान कर रहे हैं?
संपादित
डाटा योजना इस प्रकार दिखाई देगा:
"posts" : {
"123456" : {
"createdAt" : 1478696885622,
"content" : "This is post content",
"title" : "This is post title",
"userId" : "abc"
},
"789012" : {
"createdAt" : 1478696885622,
"content" : "This is post content 2",
"title" : "This is post title 2",
"userId" : "efg"
}
}
"users" : {
"abc" : {
"name" : "username1"
},
"efg" : {
"name" : "username2"
}
}
संपादित 2
मैं एक गलती की है -> Firebase ValueEventListener में पूरे डेटा प्राप्त करने में नहीं है जब कुछ है बदला हुआ। यह केवल "डेल्टा" प्राप्त होता है, here सबूत है।
तुम मुझे अपना डेटाबेस स्कीमा दिखा सकते हैं? –
मैंने प्रश्न संपादित किया। – ThirdMartian
आपने इनमें से कोई भी उल्लेख नहीं किया है। फायरबेस रीसाइक्लर एडाप्टर [फायरबेस यूआई] से (https: // github।कॉम/फायरबेस/फायरबेस ईआई-एंड्रॉइड) इस स्थिति में सबसे अच्छा है –