C++ के लिए, Firebase रीयल टाइम डेटाबेस की मदद से डेटा वापस पाना

इस दस्तावेज़ में, डेटा वापस पाने के बुनियादी तरीकों के बारे में बताया गया है. साथ ही, इसमें Firebase के डेटा को क्रम से लगाने और फ़िल्टर करने के तरीके के बारे में भी जानकारी दी गई है.

शुरू करने से पहले

पक्का करें कि आपने अपना ऐप्लिकेशन सेट अप कर लिया हो और डेटाबेस को ऐक्सेस किया जा सकता हो, जैसा कि Get Started गाइड में बताया गया है.

डेटा वापस पाना

Firebase का डेटा वापस पाने के लिए, GetValue() को एक बार कॉल किया जाता है या FirebaseDatabase रेफ़रंस पर ValueListener जोड़ा जाता है. वैल्यू लिसनर को डेटा की शुरुआती स्थिति के लिए एक बार और डेटा में बदलाव होने पर फिर से कॉल किया जाता है.

DatabaseReference पाना

डेटाबेस में डेटा लिखने के लिए, आपको DatabaseReference का इंस्टेंस चाहिए:

    // Get the root reference location of the database.
    firebase::database::DatabaseReference dbref = database->GetReference();

डेटा को एक बार पढ़ना

किसी दिए गए पाथ पर मौजूद कॉन्टेंट का स्टैटिक स्नैपशॉट एक बार पढ़ने के लिए, GetValue() तरीके का इस्तेमाल किया जा सकता है. टास्क के नतीजे में, उस जगह का स्नैपशॉट शामिल होगा. इसमें चाइल्ड डेटा भी शामिल होगा. अगर कोई डेटा नहीं है, तो दिखाया गया स्नैपशॉट null होता है.

  firebase::Future&ltfirebase::database::DataSnapshot&gt result =
    dbRef.GetReference("Leaders").GetValue();

अनुरोध सबमिट कर दिया गया है, लेकिन वैल्यू पढ़ने के लिए हमें फ़्यूचर के पूरा होने का इंतज़ार करना होगा. आम तौर पर, गेम लूप में चलते हैं. साथ ही, अन्य ऐप्लिकेशन की तुलना में, इनमें कॉलबैक कम होते हैं. इसलिए, आम तौर पर आपको पूरा होने के लिए पोल करना होगा.

  // 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 कॉलबैक के बाद होते हैं. ऐसा इसलिए होता है, क्योंकि आइटम का क्रम बदल जाता है (यह आपके मौजूदा क्रम के हिसाब से तय करने के तरीके पर निर्भर करता है).

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&ltfirebase::database::DataSnapshot&gt result =
    dbRef.GetReference("Leaders").AddValueListener(listener);

Future&ltDataSnapshot&gt के नतीजे में, इवेंट के समय डेटाबेस में बताई गई जगह का डेटा शामिल होता है. स्नैपशॉट पर 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&ltfirebase::database::DataSnapshot&gt result =
    dbRef.GetReference("GameSessionComments").AddChildListener(listener);

OnChildAdded कॉलबैक का इस्तेमाल, आम तौर पर Firebase डेटाबेस में आइटम की सूची वापस पाने के लिए किया जाता है. OnChildAdded कॉलबैक को हर मौजूदा चाइल्ड के लिए एक बार कॉल किया जाता है. इसके बाद, बताए गए पाथ में नया चाइल्ड जोड़े जाने पर इसे फिर से कॉल किया जाता है. लिसनर को नया चाइल्ड डेटा वाला स्नैपशॉट पास किया जाता है.

OnChildChanged कॉलबैक को हर बार तब कॉल किया जाता है, जब चाइल्ड नोड में बदलाव किया जाता है. इसमें चाइल्ड नोड के डिसेंडेंट में होने वाले बदलाव भी शामिल होते हैं. इसका इस्तेमाल, आम तौर पर OnChildAdded और OnChildRemoved कॉल के साथ किया जाता है, ताकि आइटम की सूची में होने वाले बदलावों का जवाब दिया जा सके. लिसनर को पास किए गए स्नैपशॉट में, चाइल्ड के लिए अपडेट किया गया डेटा शामिल होता है.

OnChildRemoved कॉलबैक तब ट्रिगर होता है, जब कोई इमीडिएट चाइल्ड हटाया जाता है. इसका इस्तेमाल, आम तौर पर OnChildAdded और OnChildChanged कॉलबैक के साथ किया जाता है. कॉलबैक को पास किए गए स्नैपशॉट में, हटाए गए चाइल्ड का डेटा शामिल होता है.

OnChildMoved कॉलबैक तब ट्रिगर होता है, जब OnChildChanged कॉल को किसी ऐसे अपडेट से बढ़ाया जाता है जिससे चाइल्ड का क्रम बदल जाता है. इसका इस्तेमाल, OrderByChild या OrderByValue के साथ क्रम से लगाए गए डेटा के साथ किया जाता है.

डेटा को क्रम से लगाना और फ़िल्टर करना

कुंजी, वैल्यू या चाइल्ड की वैल्यू के हिसाब से क्रम से लगाया गया डेटा वापस पाने के लिए, Realtime Database Query क्लास का इस्तेमाल किया जा सकता है. क्रम से लगाए गए नतीजों को, नतीजों की किसी खास संख्या या कुंजियों या वैल्यू की किसी रेंज के हिसाब से भी फ़िल्टर किया जा सकता है.

डेटा को क्रम से लगाना

क्रम से लगाया गया डेटा वापस पाने के लिए, सबसे पहले क्रम से लगाने के किसी एक तरीके के बारे में बताएं. इससे यह तय किया जा सकेगा कि नतीजों को किस क्रम में लगाया जाए:

तरीका इस्तेमाल
OrderByChild() नतीजों को, बताई गई चाइल्ड कुंजी की वैल्यू के हिसाब से क्रम से लगाएं.
OrderByKey() नतीजों को चाइल्ड कुंजियों के हिसाब से क्रम से लगाएं.
OrderByValue() नतीजों को चाइल्ड वैल्यू के हिसाब से क्रम से लगाएं.

एक बार में, क्रम से लगाने का सिर्फ़ एक तरीका इस्तेमाल किया जा सकता है. एक ही क्वेरी में, क्रम से लगाने के किसी तरीके को एक से ज़्यादा बार कॉल करने पर गड़बड़ी होती है.

यहां दिए गए उदाहरण में बताया गया है कि स्कोर के हिसाब से क्रम से लगाए गए स्कोर लीडरबोर्ड की सूचना कैसे पाई जा सकती है.

  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() क्रम से लगाने के चुने गए तरीके के आधार पर, बताई गई कुंजी या वैल्यू के बराबर वाले आइटम वापस पाएं.

क्रम से लगाने के तरीकों के उलट, सीमा या रेंज के कई फ़ंक्शन को जोड़ा जा सकता है. उदाहरण के लिए, नतीजों को वैल्यू की किसी खास रेंज तक सीमित करने के लिए, 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() का इस्तेमाल करने पर, बताए गए चाइल्ड कुंजी वाला डेटा इस तरह क्रम से लगाया जाता है:

  1. बताई गई चाइल्ड कुंजी के लिए null वैल्यू वाले चाइल्ड सबसे पहले आते हैं.
  2. बताई गई चाइल्ड कुंजी के लिए false वैल्यू वाले चाइल्ड इसके बाद आते हैं. अगर कई चाइल्ड की वैल्यू false है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.
  3. बताई गई चाइल्ड कुंजी के लिए true वैल्यू वाले चाइल्ड इसके बाद आते हैं. अगर कई चाइल्ड की वैल्यू true है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.
  4. न्यूमेरिक वैल्यू वाले चाइल्ड इसके बाद आते हैं. इन्हें बढ़ते क्रम में लगाया जाता है. अगर कई चाइल्ड की वैल्यू, बताई गई चाइल्ड नोड के लिए एक जैसी है, तो उन्हें कुंजी के हिसाब से क्रम से लगाया जाता है.
  5. स्ट्रिंग, नंबर के बाद आती हैं और इन्हें बढ़ते क्रम में लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. अगर कई चाइल्ड की वैल्यू, बताई गई चाइल्ड नोड के लिए एक जैसी है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.
  6. ऑब्जेक्ट सबसे आखिर में आते हैं और इन्हें बढ़ते क्रम में कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.

OrderByKey

अपने डेटा को क्रम से लगाने के लिए, OrderByKey() का इस्तेमाल करने पर, डेटा को कुंजी के हिसाब से बढ़ते क्रम में दिखाया जाता है.

  1. ऐसे चाइल्ड सबसे पहले आते हैं जिनकी कुंजी को 32-बिट इंटिजर के तौर पर पार्स किया जा सकता है. इन्हें बढ़ते क्रम में लगाया जाता है.
  2. ऐसे चाइल्ड इसके बाद आते हैं जिनकी कुंजी के तौर पर स्ट्रिंग वैल्यू होती है. इन्हें बढ़ते क्रम में लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.

OrderByValue

OrderByValue() का इस्तेमाल करने पर, चाइल्ड को उनकी वैल्यू के हिसाब से क्रम से लगाया जाता है. क्रम से लगाने के मानदंड, OrderByChild() के जैसे ही होते हैं. हालांकि, इसमें बताई गई चाइल्ड कुंजी की वैल्यू के बजाय, नोड की वैल्यू का इस्तेमाल किया जाता है.

अगले चरण