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

Future&ltDataSnapshot&gt के नतीजे में, इवेंट के समय डेटाबेस में तय की गई जगह का डेटा शामिल होता है. किसी स्नैपशॉट में value() को कॉल करने पर, डेटा को दिखाने वाला Variant दिखता है.

इस उदाहरण में, OnCancelled तरीके को भी बदला गया है, ताकि यह देखा जा सके कि रीडिंग रद्द हुई है या नहीं. उदाहरण के लिए, अगर क्लाइंट के पास Firebase डेटाबेस की लोकेशन से पढ़ने की अनुमति नहीं है, तो रीड को रद्द किया जा सकता है. database::Error से पता चलेगा कि गड़बड़ी क्यों हुई.

चाइल्ड लिसनर क्लास

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

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

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

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

अगले चरण