डेटा की सूचियों के साथ काम करना

डेटाबेस के बारे में जानकारी पाएं

डेटाबेस से डेटा पढ़ने या उसमें बदलाव करने के लिए, आपके पास DatabaseReference का एक इंस्टेंस होना चाहिए:

DatabaseReference ref = FirebaseDatabase.instance.ref();

पढ़ने और लिखने की सूचियां

डेटा की सूची में जोड़ें

एक से ज़्यादा उपयोगकर्ताओं वाले ऐप्लिकेशन की किसी सूची में डेटा जोड़ने के लिए, push() तरीके का इस्तेमाल करें. जब भी तय की गई Firebase पहचान फ़ाइल में कोई नया चाइल्ड जोड़ा जाता है, तब push() वाला तरीका एक यूनीक कुंजी जनरेट करता है. सूची में हर नए एलिमेंट के लिए, अपने-आप जनरेट होने वाली इन कुंजियों का इस्तेमाल करके, कई क्लाइंट एक ही समय पर बच्चों को एक ही जगह पर जोड़ सकते हैं. इससे उन्हें एक ही समय पर, एक ही समय पर अलग-अलग क्वेरी लिखने की ज़रूरत नहीं पड़ती. push() से जनरेट की गई यूनीक कुंजी, टाइमस्टैंप के आधार पर बनाई जाती है. इसलिए, सूची में मौजूद आइटम, समय के हिसाब से अपने-आप क्रम में लग जाते हैं.

बच्चे की अपने-आप जनरेट हुई कुंजी की वैल्यू पाने या उसके लिए डेटा सेट करने के लिए, push() तरीके से मिले नए डेटा के रेफ़रंस का इस्तेमाल किया जा सकता है. push() पहचान फ़ाइल की .key प्रॉपर्टी में, अपने-आप जनरेट हुई कुंजी शामिल होती है.

अपने-आप जनरेट होने वाली इन कुंजियों का इस्तेमाल करके, अपने डेटा स्ट्रक्चर को आसानी से फ़्लैट किया जा सकता है. ज़्यादा जानकारी के लिए, डेटा फ़ैन-आउट का उदाहरण देखें.

उदाहरण के लिए, push() का इस्तेमाल सोशल मीडिया ऐप्लिकेशन में पोस्ट की सूची में नई पोस्ट जोड़ने के लिए किया जा सकता है:

DatabaseReference postListRef = FirebaseDatabase.instance.ref("posts");
DatabaseReference newPostRef = postListRef.push();
newPostRef.set({
  // ...
});

बच्चों के लिए बने इवेंट सुनें

चाइल्ड इवेंट तब ट्रिगर होते हैं, जब कोई कार्रवाई नोड के चाइल्ड पर होती है. उदाहरण के लिए, push() तरीके से जोड़ा गया नया चाइल्ड या update() तरीके से अपडेट किया गया चाइल्ड इवेंट.

इवेंट आम तौर पर इस्तेमाल
onChildAdded आइटम की सूचियां पाएं या आइटम की सूची में जोड़े गए आइटम सुनें. यह इवेंट हर मौजूदा चाइल्ड के लिए एक बार ट्रिगर होता है. इसके बाद, जब भी तय पाथ में कोई नया चाइल्ड जोड़ा जाता है, तब यह इवेंट ट्रिगर होता है. लिसनर को एक स्नैपशॉट भेजा जाता है, जिसमें नए बच्चे का डेटा शामिल होता है.
onChildChanged सूची में मौजूद आइटम में हुए बदलावों को सुनें. चाइल्ड नोड में बदलाव होने पर यह इवेंट ट्रिगर होता है. इसमें चाइल्ड नोड के डिसेंडेंट में होने वाला कोई भी बदलाव शामिल है. इवेंट लिसनर को भेजे गए स्नैपशॉट में, बच्चे का अपडेट किया गया डेटा शामिल होता है.
onChildRemoved सूची से हटाए जा रहे आइटम सुनें. यह इवेंट तब ट्रिगर होता है, जब तुरंत किसी चाइल्ड को हटाया जाता है.कॉलबैक ब्लॉक को दिए गए स्नैपशॉट में, हटाए गए बच्चे का डेटा होता है.
onChildMoved क्रम वाली सूची में आइटम के क्रम में हुए बदलावों को सुनें. onchildMoved इवेंट, हमेशा उस onChildChanged इवेंट के बाद आते हैं जिसकी वजह से आइटम का क्रम बदलता है (यह आपके मौजूदा ऑर्डर के तरीके के हिसाब से तय होता है).

डेटाबेस में किसी खास नोड में हुए बदलावों को सुनने के लिए, इन सभी तरीकों का इस्तेमाल किया जा सकता है. उदाहरण के लिए, किसी पोस्ट की टिप्पणियों में गतिविधि की निगरानी करने के लिए, कोई सोशल ब्लॉगिंग ऐप्लिकेशन एक साथ इन तरीकों का इस्तेमाल कर सकता है, जैसा कि यहां दिखाया गया है:

final commentsRef = FirebaseDatabase.instance.ref("post-comments/$postId");
commentsRef.onChildAdded.listen((event) {
  // A new comment has been added, so add it to the displayed list.
});
commentsRef.onChildChanged.listen((event) {
  // A comment has changed; use the key to determine if we are displaying this
  // comment and if so displayed the changed comment.
});
commentsRef.onChildRemoved.listen((event) {
  // A comment has been removed; use the key to determine if we are displaying
  // this comment and if so remove it.
});

वैल्यू इवेंट सुनें

चाइल्ड इवेंट को सुनना, डेटा की सूचियों को पढ़ने का सुझाया गया तरीका है. हालांकि, ऐसी स्थितियां भी हैं जिनमें वैल्यू इवेंट को सुनना फ़ायदेमंद होता है.

value लिसनर को डेटा की सूची अटैच करने पर, डेटा की पूरी सूची एक स्नैपशॉट के तौर पर दिखेगी. इसके बाद, इसे लूप में अलग-अलग चाइल्ड पब्लिशर को ऐक्सेस करने के लिए इस्तेमाल किया जा सकता है.

भले ही, क्वेरी के लिए सिर्फ़ एक मैच हो, तब भी स्नैपशॉट में एक सूची होती है. इसमें सिर्फ़ एक आइटम मौजूद होता है. आइटम को ऐक्सेस करने के लिए, आपको नतीजे पर लूप करना होगा:

myTopPostsQuery.onValue.listen((event) {
  for (final child in event.snapshot.children) {
    // Handle the post.
  }
}, onError: (error) {
  // Error.
});

यह पैटर्न तब काम का हो सकता है, जब आपको एक ही कार्रवाई में सूची के सभी चाइल्ड एंट्री को फ़ेच करना हो. इससे, बच्चे के जोड़े गए अन्य इवेंट को सुनने के बजाय, उन्हें फ़ेच किया जा सकता है.

डेटा को क्रम से लगाना और फ़िल्टर करना

कुंजी, वैल्यू या बच्चे की वैल्यू के हिसाब से क्रम में लगाए गए डेटा को वापस पाने के लिए, Query क्लास का इस्तेमाल किया जा सकता है. क्रम से लगाए गए नतीजे को तय की गई संख्या या कुंजियों या वैल्यू की रेंज के हिसाब से भी फ़िल्टर किया जा सकता है.

डेटा को क्रम से लगाएं

नतीजों का क्रम तय करने के लिए, क्रम से लगाए गए डेटा में से किसी एक को चुनकर शुरुआत करें:

तरीका इस्तेमाल किए जाने से जुड़ी जानकारी
orderByChild() किसी खास चाइल्ड कुंजी या नेस्ट किए गए चाइल्ड पाथ की वैल्यू के हिसाब से नतीजों को क्रम से लगाएं.
orderByKey() चाइल्ड कुंजियों के हिसाब से नतीजों को क्रम से लगाएं.
orderByValue() चाइल्ड वैल्यू के हिसाब से नतीजों को क्रम से लगाएं.

ऑर्डर करने के लिए, एक बार में सिर्फ़ एक तरीका इस्तेमाल किया जा सकता है. एक ही क्वेरी में, ऑर्डर के क्रम को कई बार कॉल करने से गड़बड़ी होती है.

यह उदाहरण दिखाता है कि आप उपयोगकर्ता की स्टार संख्या के हिसाब से क्रम में लगाई गई उनकी सबसे लोकप्रिय पोस्ट की सूची कैसे वापस ला सकते हैं:

final myUserId = FirebaseAuth.instance.currentUser?.uid;
final topUserPostsRef = FirebaseDatabase.instance
    .ref("user-posts/$myUserId")
    .orderByChild("starCount");

यह ऐसी क्वेरी के बारे में बताता है जो चाइल्ड लिसनर के साथ जुड़ने पर क्लाइंट, डेटाबेस के पाथ से उपयोगकर्ता की पोस्ट को उनके यूज़र आईडी के हिसाब से सिंक करती है. इन पोस्ट को हर पोस्ट को मिले स्टार की संख्या के हिसाब से क्रम में लगाया जाता है. आईडी को इंडेक्स कुंजियों के तौर पर इस्तेमाल करने की इस तकनीक को 'डेटा फ़ैन आउट' कहा जाता है. इसके बारे में ज़्यादा जानने के लिए, अपने डेटाबेस का स्ट्रक्चर तैयार करना लेख पढ़ें.

orderByChild() तरीके को कॉल करने पर, नतीजों को क्रम में लगाने के लिए चाइल्ड कुंजी तय की जाती है. इस मामले में, पोस्ट को उनके "starCount" बच्चे की वैल्यू के हिसाब से क्रम में लगाया जाता है. अगर आपके पास डेटा ऐसा है जो

"posts": {
  "ts-functions": {
    "metrics": {
      "views" : 1200000,
      "likes" : 251000,
      "shares": 1200,
    },
    "title" : "Why you should use TypeScript for writing Cloud Functions",
    "author": "Doug",
  },
  "android-arch-3": {
    "metrics": {
      "views" : 900000,
      "likes" : 117000,
      "shares": 144,
    },
    "title" : "Using Android Architecture Components with Firebase Realtime Database (Part 3)",
    "author": "Doug",
  }
},

इस मामले में, हम metrics कुंजी के नीचे नेस्ट की गई वैल्यू के हिसाब से अपनी सूची के एलिमेंट को क्रम में लगा सकते हैं. इसके लिए, हम अपने orderByChild() कॉल में नेस्ट किए गए चाइल्ड का रिलेटिव पाथ तय करते हैं.

final mostViewedPosts =
    FirebaseDatabase.instance.ref('posts').orderByChild('metrics/views');

अन्य डेटा टाइप को क्रम में लगाने के तरीके के बारे में ज़्यादा जानने के लिए, क्वेरी डेटा को क्रम में लगाने का तरीका देखें.

डेटा फ़िल्टर करना

डेटा फ़िल्टर करने के लिए, क्वेरी बनाते समय किसी भी सीमा या रेंज वाले तरीके को क्रम के हिसाब से तरीके से जोड़ा जा सकता है.

तरीका इस्तेमाल किए जाने से जुड़ी जानकारी
limitToFirst() यह आइटम, नतीजों के क्रम वाली सूची की शुरुआत से लौटाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या सेट करता है.
limitToLast() यह विकल्प, नतीजों की क्रम वाली सूची के आखिर से लौटाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या को सेट करता है.
startAt() चुने गए ऑर्डर के हिसाब से, बताई गई कुंजी या वैल्यू से ज़्यादा या उसके बराबर के आइटम दिखाएं.
startAfter() दिए गए क्रम के हिसाब से, चुने गए तरीके के हिसाब से बताई गई कुंजी या वैल्यू से ज़्यादा वाले आइटम दिखाएं.
endAt() चुने गए ऑर्डर के हिसाब से, बताई गई कुंजी या वैल्यू से कम या उसके बराबर के आइटम दिखाएं.
endBefore() चुने गए ऑर्डर के हिसाब से, चुने गए तरीके के आधार पर, बताई गई कुंजी या वैल्यू से कम वाले आइटम दिखाएं.
equalTo() चुने गए ऑर्डर के हिसाब से, चुने गए तरीके के हिसाब से, बताई गई कुंजी या वैल्यू के बराबर की वैल्यू वाले आइटम दिखाएं.

क्रम के हिसाब से क्रम में लगाने वाले तरीकों के उलट, एक से ज़्यादा सीमा या रेंज फ़ंक्शन को जोड़ा जा सकता है. उदाहरण के लिए, startAt() और endAt() तरीकों को मिलाकर, वैल्यू की तय की गई रेंज के नतीजों को सीमित किया जा सकता है.

नतीजों की संख्या को सीमित करें

limitToFirst() और limitToLast() तरीकों का इस्तेमाल करके, यह तय किया जा सकता है कि किसी इवेंट के साथ ज़्यादा से ज़्यादा कितने बच्चों को सिंक किया जाए. उदाहरण के लिए, अगर 100 की सीमा सेट करने के लिए limitToFirst() का इस्तेमाल किया जाता है, तो शुरुआत में आपको सिर्फ़ 100 onChildAdded इवेंट मिलेंगे. अगर आपके Firebase डेटाबेस में 100 से कम आइटम स्टोर हैं, तो हर आइटम के लिए onChildAdded इवेंट ट्रिगर होता है.

आइटम बदलने पर, आपको क्वेरी डालने वाले आइटम के लिए onChildAdded इवेंट और उसे छोड़ने वाले आइटम के लिए onChildRemoved इवेंट मिलते हैं. इस तरह कुल संख्या 100 ही रहती है.

यह उदाहरण दिखाता है कि उदाहरण के तौर पर बनाया गया ब्लॉगिंग ऐप्लिकेशन, सभी उपयोगकर्ताओं की सबसे हाल की 100 पोस्ट की सूची पाने के लिए क्वेरी को कैसे परिभाषित करता है:

final recentPostsRef = FirebaseDatabase.instance.ref('posts').limitToLast(100);

यह उदाहरण सिर्फ़ एक क्वेरी के बारे में बताता है. असल में डेटा को सिंक करने के लिए, उसके साथ लिसनर अटैच होना ज़रूरी है.

कुंजी या वैल्यू के हिसाब से फ़िल्टर करें

startAt(), startAfter(),endAt(), endBefore(), और equalTo() का इस्तेमाल करके, किसी भी क्वेरी के लिए अपने हिसाब से शुरू, आखिर, और समतुल्य पॉइंट चुने जा सकते हैं. यह डेटा को पेजों में बांटने या बच्चों वाले ऐसे आइटम ढूंढने में मददगार हो सकता है जिनकी कोई खास वैल्यू हो.

क्वेरी डेटा को क्रम से कैसे लगाया जाता है

इस सेक्शन में बताया गया है कि Query क्लास में, डेटा को हर क्रम के हिसाब से कैसे क्रम में लगाया जाता है.

orderByChild

orderByChild() का इस्तेमाल करते समय, जिस डेटा में चाइल्ड पासकोड शामिल होता है उसे इस तरह से क्रम में लगाया जाता है:

  1. तय की गई चाइल्ड कुंजी के लिए null वैल्यू वाले बच्चे पहले आते हैं.
  2. तय की गई चाइल्ड कुंजी के लिए false मान वाले बच्चों के आगे आएं. अगर एक से ज़्यादा बच्चों के लिए false वैल्यू है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़ी के हिसाब से क्रम में लगाया जाता है.
  3. तय की गई चाइल्ड कुंजी के लिए true मान वाले बच्चों के आगे आएं. अगर एक से ज़्यादा बच्चों की वैल्यू true है, तो उन्हें कुंजी के हिसाब से लेसिकोलॉजिकल तरीके से क्रम में लगाया जाता है.
  4. अंकों वाली वैल्यू वाले बच्चे आगे बढ़ते हैं. इन्हें बढ़ते क्रम में लगाया जाता है. अगर बताए गए चाइल्ड नोड के लिए कई चाइल्ड एंट्री की संख्या एक जैसी है, तो उन्हें कुंजी के हिसाब से क्रम में लगाया जाता है.
  5. स्ट्रिंग, संख्याओं के बाद आती हैं. इन्हें बढ़ते हुए क्रम में, कोशिकीय तरीके से क्रम में लगाया जाता है. अगर बताए गए चाइल्ड नोड के लिए कई चाइल्ड नोड की वैल्यू एक जैसी होती है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक तौर पर क्रम में लगाया जाता है.
  6. ऑब्जेक्ट आखिरी में आते हैं और उन्हें बढ़ते क्रम में कुंजी के हिसाब से लेक्सिकोग्राफ़िक तरीके से क्रम में लगाया जाता है.

orderByKey

डेटा को क्रम से लगाने के लिए orderByKey() का इस्तेमाल करने पर, डेटा को कुंजी के हिसाब से बढ़ते क्रम में दिखाया जाता है.

  1. जिन बच्चों के पास कुंजी होती है उन्हें 32-बिट वाले पूर्णांक के तौर पर पार्स किया जा सकता है उन्हें बढ़ते क्रम में क्रम में लगाया जाता है.
  2. जिन बच्चों में स्ट्रिंग वैल्यू के आगे मुख्य होता है उन्हें बढ़ते क्रम में लेक्सिकोग्राफ़ी के हिसाब से क्रम में लगाया जाता है.

orderByValue

orderByValue() का इस्तेमाल करते समय, बच्चों को उनकी वैल्यू के हिसाब से क्रम में लगाया जाता है. ऑर्डर की शर्त वही होती है जो orderByChild() में होती है. हालांकि, नोड की वैल्यू का इस्तेमाल तय चाइल्ड कुंजी की वैल्यू के बजाय किया जाता है.

लिसनर को अलग करें

कॉलबैक को आपके Firebase डेटाबेस के रेफ़रंस पर, off() तरीके को कॉल करने से हटाया जाता है.

किसी एक लिसनर को off() के लिए पैरामीटर के तौर पर पास करके, उसे हटाया जा सकता है. बिना किसी तर्क के off() को उस जगह पर कॉल करने से उस जगह के सभी लिसनर हट जाते हैं.

पैरंट लिसनर पर off() को कॉल करने से, इसके चाइल्ड नोड पर रजिस्टर किए गए लिसनर अपने-आप नहीं हटते. कॉलबैक को हटाने के लिए, off() को चाइल्ड लिसनर पर भी कॉल किया जाना चाहिए.

अगले चरण