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 से यह पता चलेगा कि गड़बड़ी क्यों हुई.

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

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

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

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

जब भी किसी अपडेट की वजह से, चाइल्ड एलिमेंट का क्रम बदलता है, तो OnChildChanged कॉल को ट्रिगर करके OnChildMoved कॉलबैक ट्रिगर किया जाता है. इसका इस्तेमाल, 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() तरीकों का इस्तेमाल किया जा सकता है. उदाहरण के लिए, अगर 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. स्ट्रिंग, संख्याओं के बाद आती हैं और उन्हें अंग्रेज़ी के वर्णमाला के हिसाब से, बढ़ते क्रम में लगाया जाता है. अगर कई चाइल्ड के लिए, तय किए गए चाइल्ड node की एक ही वैल्यू है, तो उन्हें कीवर्ड के हिसाब से, वर्णमाला के क्रम में लगाया जाता है.
  6. ऑब्जेक्ट आखिर में आते हैं और उन्हें बढ़ते क्रम में, कीवर्ड के हिसाब से क्रम में लगाया जाता है.

OrderByKey

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

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

OrderByValue

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

अगले चरण