C++ के लिए Firebase रीयलटाइम डेटाबेस के साथ डेटा पुनर्प्राप्त करना

यह दस्तावेज़ डेटा को पुनर्प्राप्त करने और फायरबेस डेटा को ऑर्डर और फ़िल्टर करने के तरीके की मूल बातें शामिल करता है।

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

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

पुन: प्राप्त डेटा

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

डेटाबेस संदर्भ प्राप्त करें

डेटाबेस में डेटा लिखने के लिए, आपको 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::भविष्य संदर्भ देखें, और यह निर्धारित करने के तरीके कि परिणाम कब तैयार होगा।

घटनाओं के लिए सुनो

आप डेटा में परिवर्तनों की सदस्यता के लिए श्रोताओं को जोड़ सकते हैं:

ValueListener बेस क्लास

वापस कॉल करें विशिष्ट उपयोग
OnValueChanged पथ की संपूर्ण सामग्री में परिवर्तनों को पढ़ें और सुनें।

OnChildListener बेस क्लास

OnChildAdded वस्तुओं की सूची पुनः प्राप्त करें या वस्तुओं की सूची में परिवर्धन के लिए सुनें। सूचियों में परिवर्तनों की निगरानी करने के लिए OnChildChanged और OnChildRemoved के साथ सुझाए गए उपयोग।
OnChildChanged किसी सूची में आइटम्स में परिवर्तन के लिए सुनें। सूचियों में परिवर्तनों की निगरानी के लिए OnChildAdded और OnChildRemoved के साथ प्रयोग करें।
OnChildRemoved सूची से निकाले जा रहे आइटमों को सुनें। सूचियों में परिवर्तनों की निगरानी के लिए OnChildAdded और OnChildChanged के साथ प्रयोग करें।
OnChildMoved ऑर्डर की गई सूची में आइटम्स के क्रम में बदलाव के लिए सुनें। आइटम के ऑर्डर बदलने (आपके वर्तमान ऑर्डर-बाय मेथड के आधार पर) के कारण OnChildMoved कॉलबैक हमेशा OnChildChanged कॉलबैक का पालन करते हैं।

वैल्यू लिस्टनर क्लास

आप दिए गए पथ पर सामग्री में परिवर्तनों की सदस्यता लेने के लिए 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&ltDataSnaphot&gt परिणाम में घटना के समय डेटाबेस में निर्दिष्ट स्थान पर डेटा होता है। स्नैपशॉट पर कॉलिंग value() डेटा का प्रतिनिधित्व करने वाला एक Variant लौटाती है।

इस उदाहरण में, यह देखने के लिए कि क्या रीड रद्द किया गया है, OnCancelled मेथड को भी ओवरराइड किया गया है। उदाहरण के लिए, यदि क्लाइंट के पास फायरबेस डेटाबेस स्थान से पढ़ने की अनुमति नहीं है, तो एक रीड को रद्द किया जा सकता है। 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 कॉलबैक के संयोजन में उपयोग किया जाता है। कॉलबैक को दिए गए स्नैपशॉट में हटाए गए बच्चे का डेटा होता है।

OnChildMoved कॉलबैक ट्रिगर होता है जब भी OnChildChanged कॉल को एक अपडेट द्वारा उठाया जाता है जो बच्चे के पुनर्क्रमण का कारण बनता है। इसका उपयोग उस डेटा के साथ किया जाता है जिसे 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 कॉलबैक प्राप्त कर सकते हैं। यदि आपके फायरबेस डेटाबेस में 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() के समान हैं, नोड के मूल्य को छोड़कर निर्दिष्ट चाइल्ड कुंजी के मान के बजाय उपयोग किया जाता है।

अगले कदम