डेटाबेस का रेफ़रंस पाना
डेटाबेस से डेटा पढ़ने या उसमें डेटा लिखने के लिए, आपको 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 इवेंट की वजह से, आइटम का क्रम बदलता है. यह क्रम, आपके मौजूदा ऑर्डर-बाय तरीके के आधार पर बदलता है. |
इन सभी का इस्तेमाल, डेटाबेस में किसी खास नोड में किए गए बदलावों के लिए लिसनर सेट अप करने के लिए किया जा सकता है. उदाहरण के लिए, कोई सोशल ब्लॉगिंग ऐप्लिकेशन, किसी पोस्ट की टिप्पणियों में होने वाली गतिविधि की निगरानी करने के लिए, इन तरीकों का एक साथ इस्तेमाल कर सकता है. जैसा कि यहां दिखाया गया है:
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() तरीके को कॉल करने पर, उस चाइल्ड कुंजी को तय किया जाता है जिसके हिसाब से नतीजों को क्रम से लगाना है. इस मामले में, पोस्ट को उनके
respective "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() तरीकों का इस्तेमाल किया जा सकता है. उदाहरण के लिए, अगर 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 क्लास में, ऑर्डर-बाय के हर तरीके से डेटा को क्रम से कैसे लगाया जाता है.
orderByChild
orderByChild() का इस्तेमाल करने पर, तय की गई चाइल्ड कुंजी वाला डेटा इस तरह क्रम से लगाया जाता है:
- तय की गई चाइल्ड कुंजी के लिए,
nullवैल्यू वाले चाइल्ड सबसे पहले आते हैं. - तय की गई चाइल्ड कुंजी के लिए,
falseवैल्यू वाले चाइल्ड इसके बाद आते हैं. अगर कई चाइल्ड की वैल्यूfalseहै, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. - तय की गई चाइल्ड कुंजी के लिए,
trueवैल्यू वाले चाइल्ड इसके बाद आते हैं. अगर कई चाइल्ड की वैल्यूtrueहै, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. - न्यूमेरिक वैल्यू वाले चाइल्ड इसके बाद आते हैं. इन्हें बढ़ते क्रम में लगाया जाता है. अगर तय किए गए चाइल्ड नोड के लिए, कई चाइल्ड की न्यूमेरिकल वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से क्रम से लगाया जाता है.
- स्ट्रिंग, नंबर के बाद आती हैं और इन्हें बढ़ते क्रम में लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. अगर तय किए गए चाइल्ड नोड के लिए, कई चाइल्ड की वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.
- ऑब्जेक्ट सबसे आखिर में आते हैं और इन्हें बढ़ते क्रम में कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.
orderByKey
अपने डेटा को क्रम से लगाने के लिए, orderByKey() का इस्तेमाल करने पर, डेटा को कुंजी के हिसाब से बढ़ते क्रम में लौटाया जाता है.
- ऐसे चाइल्ड सबसे पहले आते हैं जिनकी कुंजी को 32-बिट इंटिजर के तौर पर पार्स किया जा सकता है. इन्हें बढ़ते क्रम में लगाया जाता है.
- ऐसे चाइल्ड इसके बाद आते हैं जिनकी कुंजी के तौर पर स्ट्रिंग वैल्यू होती है. इन्हें बढ़ते क्रम में लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.
orderByValue
orderByValue() का इस्तेमाल करने पर, चाइल्ड को उनकी वैल्यू के हिसाब से क्रम से लगाया जाता है. क्रम से लगाने के मानदंड, orderByChild() में इस्तेमाल किए गए मानदंडों के जैसे ही होते हैं. हालांकि, इसमें तय की गई चाइल्ड कुंजी की वैल्यू के बजाय, नोड की वैल्यू का इस्तेमाल किया जाता है.
लिसनर हटाना
कॉल बैक हटाने के लिए, अपने Firebase डेटाबेस रेफ़रंस पर off() तरीका कॉल करें.
off() को पैरामीटर के तौर पर पास करके, किसी एक लिसनर को हटाया जा सकता है.
बिना किसी आर्ग्युमेंट के, किसी जगह पर off() को कॉल करने पर, उस जगह पर मौजूद सभी लिसनर हट जाते हैं.
पैरंट लिसनर पर off() को कॉल करने पर, उसके चाइल्ड नोड पर रजिस्टर किए गए लिसनर अपने-आप नहीं हटते. कॉल बैक हटाने के लिए, चाइल्ड लिसनर पर भी off() को कॉल करना ज़रूरी है.