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

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

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

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

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

फ़ायरबेस डेटा को 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...
    }
  }

यह कुछ बुनियादी त्रुटि जाँच दिखाता है, त्रुटि जाँच पर अधिक जानकारी के लिए फायरबेस::फ्यूचर संदर्भ देखें, और यह निर्धारित करने के तरीके कि परिणाम कब तैयार है।

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

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

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&ltDataSnapshot&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 कॉलबैक का उपयोग आमतौर पर फायरबेस डेटाबेस में आइटमों की सूची पुनर्प्राप्त करने के लिए किया जाता है। 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 परिभाषित करता है जो वैल्यू लिस्टनर के साथ संयुक्त होने पर क्लाइंट को प्रत्येक प्रविष्टि के स्कोर के अनुसार डेटाबेस में लीडरबोर्ड के साथ सिंक्रनाइज़ करता है। आप स्ट्रक्चर योर डेटाबेस में अपने डेटा को कुशलतापूर्वक संरचित करने के बारे में अधिक पढ़ सकते हैं।

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() के समान है, सिवाय इसके कि निर्दिष्ट चाइल्ड कुंजी के मान के बजाय नोड के मान का उपयोग किया जाता है।

अगले कदम