इस दस्तावेज़ में, डेटा वापस पाने और Firebase डेटा को क्रम से लगाने और फ़िल्टर करने के बारे में बुनियादी जानकारी दी गई है.
शुरू करने से पहले
पक्का करें कि आपने अपना ऐप्लिकेशन सेटअप कर लिया हो और डेटाबेस को ऐक्सेस किया जा सकता हो. इसके बारे में Get Started
गाइड में बताया गया है.
डेटा वापस लाया जा रहा है
Firebase डेटा को GetValue()
को एक बार कॉल करके या FirebaseDatabase
रेफ़रंस पर ValueListener
अटैच करके वापस पाया जाता है. value
listener को डेटा की शुरुआती स्थिति के लिए एक बार कॉल किया जाता है. इसके बाद, जब भी डेटा बदलता है, तब इसे फिर से कॉल किया जाता है.
DatabaseReference पाना
डेटाबेस में डेटा लिखने के लिए, आपको DatabaseReference
के इंस्टेंस की ज़रूरत होगी:
// Get the root reference location of the database. firebase::database::DatabaseReference dbref = database->GetReference();
डेटा को एक बार पढ़ना
GetValue()
तरीके का इस्तेमाल करके, किसी दिए गए पाथ पर मौजूद कॉन्टेंट का स्टैटिक स्नैपशॉट एक बार पढ़ा जा सकता है. टास्क के नतीजे में, उस जगह का स्नैपशॉट दिखेगा. इसमें उस जगह का पूरा डेटा शामिल होगा. इसमें बच्चों का डेटा भी शामिल होगा. अगर कोई डेटा नहीं है, तो स्नैपशॉट के तौर पर null
दिखता है.
firebase::Future<firebase::database::DataSnapshot> result = dbRef.GetReference("Leaders").GetValue();
अनुरोध किया गया है, लेकिन हमें Future के पूरा होने का इंतज़ार करना होगा. इसके बाद ही, हम वैल्यू पढ़ पाएंगे. गेम आम तौर पर लूप में चलते हैं और अन्य ऐप्लिकेशन के मुकाबले, इनमें कॉलबैक कम होते हैं. इसलिए, आम तौर पर आपको गेम पूरा होने के लिए पोल करना होगा.
// In the game loop that polls for the result... if (result.status() != firebase::kFutureStatusPending) { if (result.status() != firebase::kFutureStatusComplete) { LogMessage("ERROR: GetValue() returned an invalid result."); // Handle the error... } else if (result.error() != firebase::database::kErrorNone) { LogMessage("ERROR: GetValue() returned error %d: %s", result.error(), result.error_message()); // Handle the error... } else { firebase::database::DataSnapshot snapshot = result.result(); // Do something with the snapshot... } }
इससे गड़बड़ी की कुछ बुनियादी जांच दिखती है. गड़बड़ी की जांच करने और यह पता लगाने के बारे में ज़्यादा जानकारी के लिए कि नतीजा कब तैयार होगा, firebase::Future का रेफ़रंस देखें.
इवेंट के इनपुट के लिए रीऐक्ट करना
डेटा में होने वाले बदलावों की सूचना पाने के लिए, लिसनर जोड़े जा सकते हैं:
ValueListener
बेसिक क्लास
कॉलबैक | आम तौर पर इस्तेमाल |
---|---|
OnValueChanged |
किसी पाथ के पूरे कॉन्टेंट में हुए बदलावों को पढ़ना और सुनना. |
OnChildListener
बेसिक क्लास
OnChildAdded
| आइटम की सूचियां वापस पाना या आइटम की सूची में जोड़े गए आइटम के बारे में सुनना.
सूचियों में हुए बदलावों को मॉनिटर करने के लिए, OnChildChanged और OnChildRemoved के साथ इस्तेमाल करने का सुझाव दिया गया है. |
OnChildChanged |
किसी सूची में मौजूद आइटम में हुए बदलावों के बारे में सूचना पाना. सूचियों में हुए बदलावों को मॉनिटर करने के लिए, OnChildAdded और OnChildRemoved के साथ इसका इस्तेमाल करें. |
OnChildRemoved |
किसी सूची से आइटम हटाए जाने पर सूचना पाने की सुविधा. सूचियों में हुए बदलावों को मॉनिटर करने के लिए, OnChildAdded और OnChildChanged के साथ इसका इस्तेमाल करें. |
OnChildMoved |
क्रम से लगाई गई सूची में आइटम के क्रम में हुए बदलावों को सुनने के लिए.
OnChildMoved आइटम के क्रम में बदलाव होने की वजह से, OnChildChanged कॉलबैक हमेशा OnChildMoved कॉलबैक को फ़ॉलो करते हैं. आइटम के क्रम में बदलाव, ऑर्डर करने के मौजूदा तरीके के आधार पर होता है. |
ValueListener क्लास
किसी पाथ पर मौजूद कॉन्टेंट में होने वाले बदलावों की सूचना पाने के लिए, OnValueChanged
कॉलबैक का इस्तेमाल किया जा सकता है. यह कॉलबैक, लिसनर के अटैच होने पर एक बार ट्रिगर होता है. इसके बाद, बच्चों के डेटा में बदलाव होने पर हर बार ट्रिगर होता है. कॉलबैक को उस जगह का स्नैपशॉट पास किया जाता है. इसमें उस जगह का पूरा डेटा होता है. इसमें चाइल्ड डेटा भी शामिल होता है. अगर कोई डेटा नहीं है, तो स्नैपशॉट के तौर पर null
दिखता है.
यहां दिए गए उदाहरण में, डेटाबेस से लीडरबोर्ड के स्कोर पाने वाले गेम को दिखाया गया है:
class LeadersValueListener : public firebase::database::ValueListener { public: void OnValueChanged( const firebase::database::DataSnapshot& snapshot) override { // Do something with the data in snapshot... } void OnCancelled(const firebase::database::Error& error_code, const char* error_message) override { LogMessage("ERROR: LeadersValueListener canceled: %d: %s", error_code, error_message); } }; // Elsewhere in the code... LeadersValueListener* listener = new LeadersValueListener(); firebase::Future<firebase::database::DataSnapshot> result = dbRef.GetReference("Leaders").AddValueListener(listener);
Future<DataSnapshot>
नतीजे में, इवेंट के समय डेटाबेस में मौजूद, बताई गई जगह का डेटा होता है. स्नैपशॉट पर value()
को कॉल करने पर, डेटा दिखाने वाला Variant
मिलता है.
इस उदाहरण में, OnCancelled
तरीके को भी बदला गया है, ताकि यह देखा जा सके कि पढ़ने की प्रोसेस रद्द की गई है या नहीं. उदाहरण के लिए, अगर क्लाइंट के पास Firebase डेटाबेस की किसी जगह से डेटा पढ़ने की अनुमति नहीं है, तो पढ़ने की प्रोसेस रद्द की जा सकती है. database::Error
से पता चलेगा कि पुष्टि क्यों नहीं हो सकी.
ChildListener क्लास
नोड के बच्चों के साथ होने वाले कुछ खास ऑपरेशनों के जवाब में, चाइल्ड इवेंट ट्रिगर होते हैं. जैसे, PushChild()
तरीके से जोड़ा गया नया चाइल्ड या UpdateChildren()
तरीके से अपडेट किया गया चाइल्ड. इन सभी का एक साथ इस्तेमाल करके, डेटाबेस में किसी नोड में हुए बदलावों के बारे में सुना जा सकता है. उदाहरण के लिए, कोई गेम इन तरीकों का इस्तेमाल एक साथ कर सकता है, ताकि गेम सेशन की टिप्पणियों में होने वाली गतिविधि पर नज़र रखी जा सके. जैसा कि यहां दिखाया गया है:
class SessionCommentsChildListener : public firebase::database::ChildListener { public: void OnChildAdded(const firebase::database::DataSnapshot& snapshot, const char* previous_sibling) override { // Do something with the data in snapshot ... } void OnChildChanged(const firebase::database::DataSnapshot& snapshot, const char* previous_sibling) override { // Do something with the data in snapshot ... } void OnChildRemoved( const firebase::database::DataSnapshot& snapshot) override { // Do something with the data in snapshot ... } void OnChildMoved(const firebase::database::DataSnapshot& snapshot, const char* previous_sibling) override { // Do something with the data in snapshot ... } void OnCancelled(const firebase::database::Error& error_code, const char* error_message) override { LogMessage("ERROR: SessionCommentsChildListener canceled: %d: %s", error_code, error_message); } }; // elsewhere .... SessionCommentsChildListener* listener = new SessionCommentsChildListener(); firebase::Future<firebase::database::DataSnapshot> result = dbRef.GetReference("GameSessionComments").AddChildListener(listener);
OnChildAdded
कॉलबैक का इस्तेमाल आम तौर पर, Firebase डेटाबेस में मौजूद आइटम की सूची को वापस पाने के लिए किया जाता है. OnChildAdded
कॉलबैक को हर मौजूदा चाइल्ड के लिए एक बार कॉल किया जाता है. इसके बाद, जब भी किसी चाइल्ड को तय किए गए पाथ में जोड़ा जाता है, तब इसे फिर से कॉल किया जाता है. लिसनर को एक स्नैपशॉट भेजा जाता है, जिसमें नए चाइल्ड का डेटा होता है.
OnChildChanged
कॉलबैक को तब कॉल किया जाता है, जब किसी चाइल्ड नोड में बदलाव किया जाता है.
इसमें चाइल्ड नोड के डिसेंडेंट में किए गए बदलाव भी शामिल हैं. आम तौर पर, इसका इस्तेमाल OnChildAdded
और OnChildRemoved
कॉल के साथ किया जाता है, ताकि आइटम की सूची में हुए बदलावों का जवाब दिया जा सके. लिसनर को भेजे गए स्नैपशॉट में, बच्चे के लिए अपडेट किया गया डेटा शामिल होता है.
किसी डायरेक्ट चाइल्ड को हटाने पर, OnChildRemoved
कॉलबैक ट्रिगर होता है.
आम तौर पर, इसका इस्तेमाल OnChildAdded
और OnChildChanged
कॉलबैक के साथ किया जाता है. कॉलबैक को पास किए गए स्नैपशॉट में, हटाए गए बच्चे का डेटा होता है.
OnChildMoved
कॉलबैक तब ट्रिगर होता है, जब OnChildChanged
कॉल को किसी ऐसे अपडेट से बढ़ाया जाता है जिसकी वजह से चाइल्ड को फिर से क्रम में लगाया जाता है. इसका इस्तेमाल ऐसे डेटा के साथ किया जाता है जिसे OrderByChild
या OrderByValue
के हिसाब से क्रम में लगाया गया हो.
डेटा को क्रम से लगाना और फ़िल्टर करना
Realtime Database Query
क्लास का इस्तेमाल करके, कुंजी, वैल्यू या चाइल्ड की वैल्यू के हिसाब से क्रम से लगाया गया डेटा वापस पाया जा सकता है. क्रम से लगाए गए नतीजों को, नतीजों की किसी खास संख्या या कुंजियों या वैल्यू की किसी सीमा के हिसाब से भी फ़िल्टर किया जा सकता है.
डेटा को क्रम से लगाना
क्रम से लगाया गया डेटा वापस पाने के लिए, सबसे पहले order-by के किसी एक तरीके के बारे में बताएं. इससे यह तय किया जा सकेगा कि नतीजों को किस क्रम में लगाया जाए:
तरीका | इस्तेमाल |
---|---|
OrderByChild() |
किसी तय की गई चाइल्ड की वैल्यू के हिसाब से नतीजों को क्रम में लगाएं. |
OrderByKey()
| नतीजों को चाइल्ड की के हिसाब से क्रम में लगाएं. |
OrderByValue() |
चाइल्ड वैल्यू के हिसाब से नतीजों को क्रम से लगाएं. |
एक बार में, सिर्फ़ एक क्रम से लगाने के तरीके का इस्तेमाल किया जा सकता है. एक ही क्वेरी में order-by तरीके को कई बार कॉल करने पर गड़बड़ी होती है.
यहां दिए गए उदाहरण में, स्कोर के हिसाब से क्रम में लगे स्कोर वाले लीडरबोर्ड की सदस्यता लेने का तरीका बताया गया है.
firebase::database::Query query = dbRef.GetReference("Leaders").OrderByChild("score"); // To get the resulting DataSnapshot either use query.GetValue() and poll the // future, or use query.AddValueListener() and register to handle the // OnValueChanged callback.
यह एक firebase::Query
तय करता है. इसे ValueListener के साथ जोड़ने पर, क्लाइंट को डेटाबेस में मौजूद लीडरबोर्ड के साथ सिंक किया जाता है. लीडरबोर्ड में, हर एंट्री को स्कोर के हिसाब से क्रम में लगाया जाता है.
अपने डेटा को बेहतर तरीके से व्यवस्थित करने के बारे में ज़्यादा जानने के लिए, अपने डेटाबेस को व्यवस्थित करें लेख पढ़ें.
OrderByChild()
तरीके को कॉल करने पर, नतीजे क्रम से लगाने के लिए चाइल्ड की तय की जाती है. इस मामले में, नतीजों को हर चाइल्ड में मौजूद "score"
वैल्यू के हिसाब से क्रम में लगाया जाता है. अन्य डेटा टाइप को क्रम से लगाने के तरीके के बारे में ज़्यादा जानने के लिए, क्वेरी डेटा को क्रम से कैसे लगाया जाता है लेख पढ़ें.
डेटा फ़िल्टर करना
डेटा को फ़िल्टर करने के लिए, क्वेरी बनाते समय सीमा या रेंज के किसी भी तरीके को क्रम से लगाने के तरीके के साथ जोड़ा जा सकता है.
तरीका | इस्तेमाल |
---|---|
LimitToFirst() |
इससे नतीजों की क्रम से लगाई गई सूची की शुरुआत से, दिखाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या सेट की जाती है. |
LimitToLast() |
इससे, नतीजों की क्रम से लगाई गई सूची के आखिर से, ज़्यादा से ज़्यादा आइटम दिखाने की संख्या सेट की जाती है. |
StartAt() |
चुनी गई 'इसके हिसाब से क्रम लगाएं' विधि के आधार पर, दी गई कुंजी या वैल्यू से ज़्यादा या उसके बराबर आइटम दिखाएं. |
EndAt() |
चुनी गई 'क्रम से लगाएं' विधि के आधार पर, दी गई कुंजी या वैल्यू से कम या उसके बराबर आइटम दिखाएं. |
EqualTo() |
चुनी गई क्रम से लगाने की विधि के आधार पर, दी गई कुंजी या वैल्यू के बराबर आइटम दिखाएं. |
order-by के तरीकों के उलट, limit या range फ़ंक्शन को एक साथ इस्तेमाल किया जा सकता है.
उदाहरण के लिए, StartAt()
और EndAt()
तरीकों को मिलाकर, नतीजों को वैल्यू की तय की गई सीमा तक सीमित किया जा सकता है.
क्वेरी के लिए सिर्फ़ एक मैच होने पर भी, स्नैपशॉट एक सूची होती है. इसमें सिर्फ़ एक आइटम होता है.
नतीजों की संख्या सीमित करना
LimitToFirst()
और LimitToLast()
तरीकों का इस्तेमाल करके, किसी दिए गए कॉलबैक के लिए सिंक किए जाने वाले बच्चों की ज़्यादा से ज़्यादा संख्या सेट की जा सकती है. उदाहरण के लिए, अगर आपने LimitToFirst()
का इस्तेमाल करके 100 की सीमा सेट की है, तो आपको शुरुआत में सिर्फ़ 100 OnChildAdded
कॉलबैक मिलेंगे. अगर आपके Firebase डेटाबेस में 100 से कम आइटम सेव हैं, तो हर आइटम के लिए OnChildAdded
कॉलबैक ट्रिगर होता है.
सामान में बदलाव होने पर, आपको क्वेरी में शामिल होने वाले सामान के लिए OnChildAdded
कॉलबैक और क्वेरी से बाहर निकलने वाले सामान के लिए OnChildRemoved
कॉलबैक मिलते हैं, ताकि कुल संख्या 100 पर बनी रहे.
उदाहरण के लिए, यहां दिया गया कोड, लीडरबोर्ड में सबसे ज़्यादा स्कोर दिखाता है:
firebase::database::Query query = dbRef.GetReference("Leaders").OrderByChild("score").LimitToLast(1); // To get the resulting DataSnapshot either use query.GetValue() and poll the // future, or use query.AddValueListener() and register to handle the // OnValueChanged callback.
कुंजी या वैल्यू के हिसाब से फ़िल्टर करना
क्वेरी के लिए, अपनी पसंद के हिसाब से शुरुआती, आखिरी, और समानता वाले पॉइंट चुनने के लिए, StartAt()
, EndAt()
, और EqualTo()
का इस्तेमाल किया जा सकता है. यह डेटा को पेज के हिसाब से बांटने या किसी खास वैल्यू वाले चाइल्ड आइटम को ढूंढने के लिए काम आ सकता है.
क्वेरी के डेटा को क्रम से कैसे लगाया जाता है
इस सेक्शन में बताया गया है कि Query
क्लास में, ऑर्डर करने के हर तरीके से डेटा को कैसे क्रम से लगाया जाता है.
OrderByChild
OrderByChild()
का इस्तेमाल करने पर, दी गई चाइल्ड की के हिसाब से डेटा को इस तरह क्रम में लगाया जाता है:
- जिन बच्चों के लिए, दी गई चाइल्ड की की
null
वैल्यू है वे सबसे पहले दिखते हैं. - इसके बाद, चाइल्ड की तय की गई कुंजी के लिए
false
वैल्यू वाले बच्चे दिखते हैं. अगर कई चाइल्ड मेंfalse
की वैल्यू है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. - इसके बाद, चाइल्ड की तय की गई कुंजी के लिए
true
वैल्यू वाले बच्चे दिखते हैं. अगर कई चाइल्ड मेंtrue
वैल्यू है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. - इसके बाद, संख्या वाली वैल्यू वाले बच्चे आते हैं. इन्हें बढ़ते क्रम में लगाया जाता है. अगर एक से ज़्यादा चाइल्ड नोड के लिए, तय किए गए चाइल्ड नोड की संख्यात्मक वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से क्रम में लगाया जाता है.
- स्ट्रिंग, संख्याओं के बाद आती हैं और इन्हें लेक्सिकोग्राफ़िक क्रम में बढ़ते क्रम में लगाया जाता है. अगर कई बच्चों के लिए, चाइल्ड नोड की वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.
- ऑब्जेक्ट आखिर में आते हैं और उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में बढ़ते क्रम में लगाया जाता है.
OrderByKey
अपने डेटा को क्रम से लगाने के लिए OrderByKey()
का इस्तेमाल करने पर, डेटा को कुंजी के हिसाब से बढ़ते क्रम में दिखाया जाता है.
- जिन बच्चों की कुकी में मौजूद कुंजी को 32-बिट पूर्णांक के तौर पर पार्स किया जा सकता है उन्हें बढ़ते क्रम में सबसे पहले दिखाया जाता है.
- इसके बाद, उन बच्चों को दिखाया जाता है जिनकी कुंजी के तौर पर स्ट्रिंग वैल्यू होती है. इन्हें लेक्सिकोग्राफ़िक क्रम में बढ़ते क्रम में लगाया जाता है.
OrderByValue
OrderByValue()
का इस्तेमाल करने पर, बच्चों को उनकी वैल्यू के हिसाब से क्रम में लगाया जाता है. क्रम से लगाने के मानदंड, OrderByChild()
में दिए गए मानदंडों के जैसे ही होते हैं. हालांकि, इसमें किसी चाइल्ड की तय की गई कुंजी की वैल्यू के बजाय, नोड की वैल्यू का इस्तेमाल किया जाता है.