डेटाबेस का रेफ़रंस पाना
डेटाबेस से डेटा पढ़ने या उसमें डेटा लिखने के लिए, आपको DatabaseReference के इंस्टेंस की ज़रूरत होगी:
DatabaseReference ref = FirebaseDatabase.instance.ref();
सूचियां पढ़ना और लिखना
डेटा की सूची में जोड़ें
एक से ज़्यादा उपयोगकर्ताओं वाले ऐप्लिकेशन में, किसी सूची में डेटा जोड़ने के लिए push() तरीके का इस्तेमाल करें.
push() मेथड, Firebase के बताए गए रेफ़रंस में हर बार नया चाइल्ड जोड़ने पर एक यूनीक कुंजी जनरेट करता है. सूची में मौजूद हर नए एलिमेंट के लिए, अपने-आप जनरेट होने वाली इन कुंजियों का इस्तेमाल करके, कई क्लाइंट एक ही समय पर एक ही जगह पर चाइल्ड नोड जोड़ सकते हैं. इससे, डेटा लिखने में कोई समस्या नहीं होती. 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 इवेंट के बाद ट्रिगर होते हैं. onChildChanged इवेंट की वजह से, आइटम का क्रम बदल जाता है. यह क्रम, आपके मौजूदा order-by मेथड के आधार पर तय होता है. |
इन सभी का इस्तेमाल करके, डेटाबेस में किसी खास नोड में होने वाले बदलावों को सुना जा सकता है. उदाहरण के लिए, कोई सोशल ब्लॉगिंग ऐप्लिकेशन, किसी पोस्ट की टिप्पणियों में होने वाली गतिविधि पर नज़र रखने के लिए, इन तरीकों का एक साथ इस्तेमाल कर सकता है. इसके बारे में यहां बताया गया है:
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 क्लास का इस्तेमाल करके, कुंजी, वैल्यू या चाइल्ड की वैल्यू के हिसाब से क्रम में लगाया गया डेटा वापस पाया जा सकता है. क्रम से लगाए गए नतीजों को, नतीजों की किसी खास संख्या या कुंजियों या वैल्यू की रेंज के हिसाब से भी फ़िल्टर किया जा सकता है.
डेटा को क्रम से लगाना
क्रम से लगाए गए डेटा को वापस पाने के लिए, सबसे पहले order-by मेथड में से किसी एक को तय करें. इससे यह तय किया जा सकेगा कि नतीजों को किस क्रम में लगाया जाए:
| तरीका | इस्तेमाल |
|---|---|
orderByChild() |
नतीजों को किसी चाइल्ड कुंजी या नेस्ट किए गए चाइल्ड पाथ की वैल्यू के हिसाब से क्रम में लगाएं. |
orderByKey() |
नतीजों को चाइल्ड कुंजियों के हिसाब से क्रम में लगाएं. |
orderByValue() |
नतीजों को चाइल्ड वैल्यू के हिसाब से क्रम में लगाएं. |
एक बार में सिर्फ़ एक order-by मेथड का इस्तेमाल किया जा सकता है. एक ही क्वेरी में, order-by मेथड को कई बार कॉल करने पर गड़बड़ी होती है.
यहां दिए गए उदाहरण में, किसी उपयोगकर्ता की सबसे लोकप्रिय पोस्ट की सूची को स्टार की संख्या के हिसाब से क्रम में लगाने का तरीका बताया गया है:
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');
अन्य डेटा टाइप को क्रम से लगाने के तरीके के बारे में ज़्यादा जानने के लिए, क्वेरी डेटा को क्रम से लगाने का तरीका देखें.
डेटा फ़िल्टर करना
डेटा को फ़िल्टर करने के लिए, क्वेरी बनाते समय, सीमा या रेंज के किसी भी तरीके को order-by मेथड के साथ जोड़ा जा सकता है.
| तरीका | इस्तेमाल |
|---|---|
limitToFirst() |
इससे, नतीजों की क्रम वाली सूची की शुरुआत से दिखाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या सेट की जाती है. |
limitToLast() |
इससे नतीजों की क्रम वाली सूची के आखिर से, ज़्यादा से ज़्यादा आइटम की संख्या सेट की जाती है. |
startAt() |
चुने गए order-by मेथड के आधार पर, तय की गई कुंजी या वैल्यू से ज़्यादा या उसके बराबर आइटम दिखाता है. |
startAfter() |
चुने गए order-by मेथड के आधार पर, तय की गई कुंजी या वैल्यू से ज़्यादा वैल्यू वाले आइटम दिखाता है. |
endAt() |
चुने गए order-by मेथड के आधार पर, तय की गई कुंजी या वैल्यू से कम या उसके बराबर वाले आइटम दिखाता है. |
endBefore() |
चुने गए order-by मेथड के आधार पर, तय की गई कुंजी या वैल्यू से कम वैल्यू वाले आइटम दिखाता है. |
equalTo() |
चुने गए order-by मेथड के आधार पर, तय की गई कुंजी या वैल्यू के बराबर आइटम दिखाएं. |
order-by मेथड के उलट, कई लिमिट या रेंज फ़ंक्शन को जोड़ा जा सकता है.
उदाहरण के लिए, startAt() और endAt() तरीकों को जोड़कर, नतीजों को वैल्यू की तय की गई रेंज तक सीमित किया जा सकता है.
नतीजों की संख्या को सीमित करना
किसी इवेंट के लिए सिंक किए जाने वाले चाइल्ड इवेंट की ज़्यादा से ज़्यादा संख्या सेट करने के लिए, limitToFirst() और limitToLast() तरीकों का इस्तेमाल किया जा सकता है. उदाहरण के लिए, अगर limitToFirst() का इस्तेमाल करके 100 की सीमा सेट की जाती है, तो आपको शुरुआत में सिर्फ़ 100 onChildAdded इवेंट मिलेंगे. अगर आपके Firebase डेटाबेस में 100 से कम आइटम सेव हैं, तो हर आइटम के लिए एक onChildAdded इवेंट ट्रिगर होता है.
आइटम बदलने पर, आपको क्वेरी में शामिल होने वाले आइटम के लिए onChildAdded इवेंट और क्वेरी से बाहर होने वाले आइटम के लिए onChildRemoved इवेंट मिलते हैं. इससे आइटम की कुल संख्या 100 बनी रहती है.
यहां दिए गए उदाहरण में बताया गया है कि ब्लॉगिंग ऐप्लिकेशन का उदाहरण, सभी उपयोगकर्ताओं की 100 सबसे हाल की पोस्ट की सूची को वापस पाने के लिए क्वेरी को कैसे तय करता है:
final recentPostsRef = FirebaseDatabase.instance.ref('posts').limitToLast(100);
इस उदाहरण में सिर्फ़ एक क्वेरी को तय किया गया है. डेटा को असल में सिंक करने के लिए, इसमें एक लिसनर अटैच होना चाहिए.
कुंजी या वैल्यू के हिसाब से फ़िल्टर करें
क्वेरी के लिए, अपनी पसंद के मुताबिक शुरुआती, आखिरी, और बराबर पॉइंट चुनने के लिए, startAt(), startAfter(),endAt(), endBefore(), और equalTo() का इस्तेमाल किया जा सकता है. यह डेटा को पेज में बांटने या चाइल्ड आइटम वाले ऐसे आइटम ढूंढने के लिए मददगार हो सकता है जिनकी वैल्यू खास हो.
क्वेरी डेटा को कैसे क्रम में लगाया जाता है
इस सेक्शन में बताया गया है कि Query क्लास में, हर order-by मेथड के हिसाब से डेटा को कैसे क्रम से लगाया जाता है.
orderByChild
orderByChild() का इस्तेमाल करने पर, जिस डेटा में चाइल्ड कुंजी मौजूद होती है उसे इस तरह क्रम में लगाया जाता है:
- चाइल्ड की के लिए तय की गई
nullवैल्यू वाले चाइल्ड सबसे पहले आते हैं. - इसके बाद, वे चाइल्ड आइटम आते हैं जिनकी चाइल्ड कुंजी की वैल्यू
falseहोती है. अगर एक से ज़्यादा चाइल्ड नोड की वैल्यूfalseहै, तो उन्हें कुंजी के हिसाब से वर्णमाला के क्रम में लगाया जाता है. - इसके बाद, वे चाइल्ड आइटम आते हैं जिनकी चाइल्ड कुंजी की वैल्यू
trueहोती है. अगर कई चाइल्ड एलिमेंट की वैल्यूtrueहै, तो उन्हें कुंजी के हिसाब से वर्णमाला के क्रम में लगाया जाता है. - इसके बाद, संख्या वाली वैल्यू वाले चाइल्ड आइटम आते हैं. इन्हें बढ़ते क्रम में लगाया जाता है. अगर एक से ज़्यादा चाइल्ड नोड की संख्या वाली वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से क्रम में लगाया जाता है.
- स्ट्रिंग, संख्याओं के बाद आती हैं और उन्हें बढ़ते क्रम में लगाया जाता है. अगर एक से ज़्यादा चाइल्ड नोड की वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से वर्णमाला के क्रम में लगाया जाता है.
- ऑब्जेक्ट सबसे आखिर में आते हैं. इन्हें कुंजी के हिसाब से, वर्णमाला के बढ़ते क्रम में लगाया जाता है.
orderByKey
डेटा को क्रम से लगाने के लिए orderByKey() का इस्तेमाल करने पर, डेटा को कुंजी के हिसाब से बढ़ते क्रम में दिखाया जाता है.
- सबसे पहले, ऐसी कुंजियों वाले चाइल्ड नोड आते हैं जिन्हें 32-बिट पूर्णांक के तौर पर पार्स किया जा सकता है. इन्हें बढ़ते क्रम में लगाया जाता है.
- इसके बाद, स्ट्रिंग वैल्यू वाले चाइल्ड आइटम आते हैं. इन्हें वर्णमाला के हिसाब से बढ़ते क्रम में लगाया जाता है.
orderByValue
orderByValue() का इस्तेमाल करने पर, चाइल्ड एलिमेंट को उनकी वैल्यू के हिसाब से क्रम में लगाया जाता है. क्रम तय करने की शर्तें, orderByChild() की तरह ही होती हैं. हालांकि, इसमें किसी चाइल्ड कुंजी की वैल्यू के बजाय, नोड की वैल्यू का इस्तेमाल किया जाता है.
लिसनर को अलग करना
Firebase डेटाबेस रेफ़रंस पर off() तरीके को कॉल करके, कॉलबैक हटाए जाते हैं.
off() को पैरामीटर के तौर पर पास करके, किसी एक लिसनर को हटाया जा सकता है.
किसी जगह पर बिना किसी आर्ग्युमेंट के off() को कॉल करने पर, उस जगह पर मौजूद सभी लिसनर हट जाते हैं.
पैरंट लिसनर पर off() को कॉल करने से, उसके चाइल्ड नोड पर रजिस्टर किए गए लिसनर अपने-आप नहीं हटते. कॉलबैक को हटाने के लिए, किसी भी चाइल्ड लिसनर पर off() को भी कॉल करना होगा.