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();

इस समय अनुरोध किया जा चुका है, लेकिन वैल्यू को पढ़ने से पहले हमें 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 कॉलबैक के बाद आते हैं. ऐसा आइटम के क्रम में बदलाव होने की वजह से होता है. यह बदलाव, आपके मौजूदा order-by मेथड के आधार पर होता है.

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

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

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

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

एक बार में सिर्फ़ एक order-by मेथड का इस्तेमाल किया जा सकता है. एक ही क्वेरी में, 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" वैल्यू की वैल्यू के हिसाब से क्रम में लगाया जाता है. अन्य डेटा टाइप को क्रम में लगाने के तरीके के बारे में ज़्यादा जानने के लिए, क्वेरी डेटा को क्रम में लगाने का तरीका देखें.

डेटा फ़िल्टर करना

डेटा को फ़िल्टर करने के लिए, क्वेरी बनाते समय, लिमिट या रेंज के किसी भी तरीके को order-by मेथड के साथ जोड़ा जा सकता है.

तरीका इस्तेमाल
LimitToFirst() इससे, नतीजों की क्रम वाली सूची की शुरुआत से दिखाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या सेट की जाती है.
LimitToLast() इससे नतीजों की क्रम वाली सूची के आखिर से, ज़्यादा से ज़्यादा आइटम की संख्या सेट की जाती है.
StartAt() चुने गए order-by मेथड के आधार पर, तय की गई कुंजी या वैल्यू से ज़्यादा या उसके बराबर आइटम दिखाता है.
EndAt() चुने गए order-by मेथड के आधार पर, तय की गई कुंजी या वैल्यू से कम या उसके बराबर वाले आइटम दिखाता है.
EqualTo() चुने गए order-by मेथड के आधार पर, तय की गई कुंजी या वैल्यू के बराबर आइटम दिखाएं.

order-by मेथड के उलट, कई लिमिट या रेंज फ़ंक्शन को जोड़ा जा सकता है. उदाहरण के लिए, 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 क्लास में, हर order-by मेथड के हिसाब से डेटा को कैसे क्रम से लगाया जाता है.

OrderByChild

OrderByChild() का इस्तेमाल करने पर, जिस डेटा में चाइल्ड कुंजी मौजूद होती है उसे इस तरह क्रम में लगाया जाता है:

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

OrderByKey

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

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

OrderByValue

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

अगले चरण