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