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

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

चाइल्ड इवेंट, एक कन्वर्ज़न ऐक्शन की वजह से ट्रिगर होते हैं. किसी कार्रवाई से नोड के चिल्ड्रेन जैसे UpdateChildren() का इस्तेमाल करके, PushChild() तरीके या चाइल्ड तरीके को अपडेट किया जा रहा है तरीका. ये सभी तरीके एक साथ, आपकी समस्याओं को समझने और किसी डेटाबेस में खास नोड होता है. उदाहरण के लिए, कोई गेम इन तरीकों का इस्तेमाल कर सकता है साथ मिलकर, गेम सेशन की टिप्पणियों की गतिविधि को मॉनिटर किया जा सकता है. इसके बारे में नीचे बताया गया है:

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

अगले चरण