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

एक डेटाबेस संदर्भ प्राप्त करें

डेटाबेस से डेटा पढ़ने या लिखने के लिए, आपको DatabaseReference का एक उदाहरण चाहिए:

DatabaseReference ref = FirebaseDatabase.instance.ref();

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

डेटा की सूची में संलग्न करें

बहुउपयोगकर्ता अनुप्रयोगों में सूची में डेटा जोड़ने के लिए push() विधि का उपयोग करें। 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",
  }
},

इस मामले में, हम अपने orderByChild() कॉल में नेस्टेड चाइल्ड के सापेक्ष पथ निर्दिष्ट करके metrics कुंजी के तहत नेस्टेड मानों द्वारा हमारे सूची तत्वों को ऑर्डर कर सकते हैं।

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

अन्य डेटा प्रकारों को कैसे क्रमित किया जाता है, इस बारे में अधिक जानकारी के लिए, क्वेरी डेटा कैसे क्रमबद्ध किया जाता है देखें।

फ़िल्टरिंग डेटा

डेटा को फ़िल्टर करने के लिए, आप किसी क्वेरी का निर्माण करते समय किसी भी सीमा या श्रेणी विधियों को ऑर्डर-बाय विधि के साथ जोड़ सकते हैं।

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

ऑर्डर-बाय विधियों के विपरीत, आप कई सीमा या श्रेणी कार्यों को जोड़ सकते हैं। उदाहरण के लिए, आप परिणामों को निर्दिष्ट मानों की सीमा तक सीमित करने के लिए startAt() और endAt() विधियों को जोड़ सकते हैं।

परिणामों की संख्या सीमित करें

किसी दिए गए ईवेंट के लिए सिंक किए जाने वाले बच्चों की अधिकतम संख्या सेट करने के लिए आप limitToFirst() और limitToLast() विधियों का उपयोग कर सकते हैं। उदाहरण के लिए, यदि आप 100 की सीमा निर्धारित करने के लिए limitToFirst() उपयोग करते हैं, तो आप शुरू में केवल 100 onChildAdded ईवेंट प्राप्त करते हैं। यदि आपके फायरबेस डेटाबेस में 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() के समान हैं, नोड के मान को छोड़कर एक निर्दिष्ट चाइल्ड कुंजी के मान के बजाय उपयोग किया जाता है।

श्रोताओं को अलग करें

आपके फायरबेस डेटाबेस संदर्भ पर off() विधि को कॉल करके कॉलबैक हटा दिए जाते हैं।

आप एक श्रोता को off() के पैरामीटर के रूप में पास करके हटा सकते हैं। बिना किसी तर्क के स्थान पर कॉल करना off() उस स्थान के सभी श्रोताओं को हटा देता है।

माता-पिता श्रोता पर कॉल करना off() अपने बच्चे के नोड्स पर पंजीकृत श्रोताओं को स्वचालित रूप से नहीं हटाता है; कॉलबैक को हटाने के लिए किसी भी बाल श्रोताओं को off() भी कहा जाना चाहिए।

अगले कदम