डेटा वापस लाया जा रहा है

इस दस्तावेज़ में, डेटा को वापस पाने के बुनियादी तरीकों के साथ-साथ, Firebase डेटा को क्रम से लगाने और फ़िल्टर करने का तरीका बताया गया है.

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

Realtime Database का इस्तेमाल करने से पहले, आपको ये काम करने होंगे:

  • अपना Unity प्रोजेक्ट रजिस्टर करें और उसे Firebase का इस्तेमाल करने के लिए कॉन्फ़िगर करें.

    • अगर आपका Unity प्रोजेक्ट पहले से ही Firebase का इस्तेमाल करता है, तो इसका मतलब है कि वह पहले से ही Firebase के लिए रजिस्टर और कॉन्फ़िगर किया गया है.

    • अगर आपके पास कोई Unity प्रोजेक्ट नहीं है, तो सैंपल ऐप्लिकेशन डाउनलोड किया जा सकता है.

  • अपने Unity प्रोजेक्ट में Firebase Unity SDK टूल (खास तौर पर, FirebaseDatabase.unitypackage) जोड़ें.

ध्यान दें कि अपने Unity प्रोजेक्ट में Firebase जोड़ने के लिए, Firebase कंसोल और अपने खुले हुए Unity प्रोजेक्ट, दोनों में टास्क शामिल होते हैं. उदाहरण के लिए, कंसोल से Firebase कॉन्फ़िगरेशन फ़ाइलें डाउनलोड करके, उन्हें अपने Unity प्रोजेक्ट में ले जाना.

डेटा वापस पाना

Firebase डेटा को GetValueAsync() को एक बार कॉल करके या FirebaseDatabase रेफ़रंस पर किसी इवेंट से अटैच करके वापस पाया जाता है. डेटा की शुरुआती स्थिति के लिए, इवेंट लिसनर को एक बार और डेटा में बदलाव होने पर, फिर से कॉल किया जाता है.

DatabaseReference पाना

डेटाबेस से डेटा पढ़ने के लिए, आपको DatabaseReference का एक इंस्टेंस चाहिए:

using Firebase;
using Firebase.Database;
using Firebase.Extensions.TaskExtension; // for ContinueWithOnMainThread

public class MyScript: MonoBehaviour {
  void Start() {
    // Get the root reference location of the database.
    DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference;
  }
}

डेटा को एक बार पढ़ना

किसी दिए गए पाथ पर मौजूद कॉन्टेंट का स्टैटिक स्नैपशॉट एक बार पढ़ने के लिए, GetValueAsync तरीके का इस्तेमाल किया जा सकता है. टास्क के नतीजे में एक स्नैपशॉट होगा, जिसमें उस जगह का सारा डेटा शामिल होगा. इसमें चाइल्ड डेटा भी शामिल है. अगर कोई डेटा नहीं है, तो स्नैपशॉट के तौर पर null दिखता है.

    FirebaseDatabase.DefaultInstance
      .GetReference("Leaders")
      .GetValueAsync().ContinueWithOnMainThread(task => {
        if (task.IsFaulted) {
          // Handle the error...
        }
        else if (task.IsCompleted) {
          DataSnapshot snapshot = task.Result;
          // Do something with snapshot...
        }
      });

इवेंट सुनना

डेटा में हुए बदलावों की सदस्यता लेने के लिए, इवेंट लिसनर जोड़े जा सकते हैं:

इवेंट आम तौर पर इस्तेमाल
ValueChanged किसी पाथ के पूरे कॉन्टेंट में हुए बदलावों को पढ़ना और सुनना.
ChildAdded आइटम की सूचियां वापस पाएं या आइटम की सूची में जोड़े गए आइटम सुनें. सूचियों में होने वाले बदलावों को मॉनिटर करने के लिए, ChildChanged और ChildRemoved के साथ इस्तेमाल करने का सुझाव दिया जाता है.
ChildChanged सूची में मौजूद आइटम में होने वाले बदलावों को सुनना. सूचियों में होने वाले बदलावों को मॉनिटर करने के लिए, ChildAdded और ChildRemoved के साथ इस्तेमाल करें.
ChildRemoved किसी सूची से आइटम हटाए जाने की जानकारी सुनना. सूचियों में हुए बदलावों को मॉनिटर करने के लिए, ChildAdded और ChildChanged के साथ इस्तेमाल करें.
ChildMoved किसी सूची में आइटम के क्रम में होने वाले बदलावों को सुनना. ChildMoved इवेंट हमेशा उस ChildChanged इवेंट के बाद होते हैं जिसकी वजह से आइटम का ऑर्डर बदला है. यह बदलाव, ऑर्डर के लिए इस्तेमाल किए जा रहे मौजूदा तरीके के आधार पर होता है.

ValueChanged इवेंट

किसी दिए गए पाथ पर कॉन्टेंट में हुए बदलावों की सदस्यता लेने के लिए, ValueChanged इवेंट का इस्तेमाल किया जा सकता है. यह इवेंट, ऑडियंस के जुड़ने पर एक बार ट्रिगर होता है. इसके बाद, हर बार जब बच्चों के साथ-साथ किसी दूसरे व्यक्ति का डेटा बदलता है, तब भी यह इवेंट ट्रिगर होता है. इवेंट कॉलबैक को एक स्नैपशॉट भेजा जाता है, जिसमें उस जगह का पूरा डेटा होता है. इसमें चाइल्ड डेटा भी शामिल होता है. अगर कोई डेटा नहीं है, तो स्नैपशॉट के तौर पर null दिखता है.

इस उदाहरण में, डेटाबेस से लीडरबोर्ड के स्कोर को वापस पाने वाले गेम के बारे में बताया गया है:

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders")
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

ValueChangedEventArgs में एक DataSnapshot होता है, जिसमें इवेंट के समय डेटाबेस में तय की गई जगह का डेटा होता है. किसी स्नैपशॉट पर Value को कॉल करने पर, डेटा दिखाने वाला Dictionary<string, object> दिखता है. अगर उस जगह पर कोई डेटा मौजूद नहीं है, तो Value को कॉल करने पर null दिखता है.

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

बाद में, उसी पाथ वाले किसी भी DatabaseReference का इस्तेमाल करके, इवेंट से सदस्यता छोड़ी जा सकती है. DatabaseReference इंस्टेंस कुछ समय के लिए होते हैं और इन्हें किसी भी पाथ और क्वेरी को ऐक्सेस करने के तरीके के तौर पर देखा जा सकता है.

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders")
        .ValueChanged -= HandleValueChanged; // unsubscribe from ValueChanged.
    }

बच्चों के लिए इवेंट

चाइल्ड इवेंट, किसी ऑपरेशन के जवाब में ट्रिगर होते हैं. ये ऑपरेशन, किसी नोड के चाइल्ड पर होते हैं. जैसे, Push() तरीके से जोड़ा गया नया चाइल्ड या UpdateChildrenAsync() तरीके से अपडेट किया गया चाइल्ड. इनमें से हर एक का इस्तेमाल, डेटाबेस में किसी खास नोड में हुए बदलावों को सुनने के लिए किया जा सकता है. उदाहरण के लिए, कोई गेम इन तरीकों का इस्तेमाल करके, गेम सेशन की टिप्पणियों में की गई गतिविधि को मॉनिटर कर सकता है. ऐसा करने का तरीका यहां बताया गया है:

      var ref = FirebaseDatabase.DefaultInstance
      .GetReference("GameSessionComments");

      ref.ChildAdded += HandleChildAdded;
      ref.ChildChanged += HandleChildChanged;
      ref.ChildRemoved += HandleChildRemoved;
      ref.ChildMoved += HandleChildMoved;
    }

    void HandleChildAdded(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildChanged(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildRemoved(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildMoved(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

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

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

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

जब भी किसी अपडेट की वजह से ChildChanged इवेंट ट्रिगर होता है, तो ChildMoved इवेंट भी ट्रिगर होता है. इस अपडेट की वजह से, चाइल्ड का क्रम बदल जाता है. इसका इस्तेमाल, OrderByChild या OrderByValue के क्रम में लगाए गए डेटा के साथ किया जाता है.

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

Realtime Database Query क्लास का इस्तेमाल करके, क्रम से लगाए गए डेटा को ऐक्सेस किया जा सकता है. जैसे, कुंजी, वैल्यू या चाइल्ड की वैल्यू के हिसाब से. क्रम में लगाए गए नतीजों को, किसी खास संख्या के नतीजों या कुंजियों या वैल्यू की सीमा के हिसाब से भी फ़िल्टर किया जा सकता है.

डेटा को क्रम से लगाना

क्रम से लगाए गए डेटा को वापस पाने के लिए, क्रम से लगाने के लिए इनमें से किसी एक तरीके का इस्तेमाल करें, ताकि यह तय किया जा सके कि नतीजों को किस क्रम में लगाया जाए:

तरीका इस्तेमाल
OrderByChild() किसी चाइल्ड की वैल्यू के हिसाब से नतीजों को क्रम में लगाएं.
OrderByKey() नतीजों को चाइल्ड बटन के हिसाब से क्रम में लगाएं.
OrderByValue() नतीजों को चाइल्ड वैल्यू के हिसाब से क्रम में लगाएं.

एक बार में, क्रम से लगाने के लिए सिर्फ़ एक तरीके का इस्तेमाल किया जा सकता है. एक ही क्वेरी में, क्रम से लगाने के तरीके को कई बार कॉल करने पर गड़बड़ी का मैसेज मिलता है.

यहां दिए गए उदाहरण में, स्कोर के हिसाब से क्रम में लगाए गए लीडरबोर्ड पर सदस्यता लेने का तरीका बताया गया है.

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders").OrderByChild("score")
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

यह एक क्वेरी तय करती है. जब इसे valuechanged इवेंट लिसनर के साथ जोड़ा जाता है, तो यह क्लाइंट को डेटाबेस में मौजूद लीडरबोर्ड के साथ सिंक करता है. यह सिंक, हर एंट्री के स्कोर के हिसाब से किया जाता है. अपने डेटाबेस को व्यवस्थित करना लेख में, डेटा को व्यवस्थित करने के बारे में ज़्यादा पढ़ें.

OrderByChild() तरीके को कॉल करने पर, नतीजों को क्रम से लगाने के लिए चाइल्ड इस मामले में, नतीजों को हर चाइल्ड में "score" वैल्यू के हिसाब से क्रम में लगाया जाता है. अन्य डेटा टाइप को क्रम से लगाने के तरीके के बारे में ज़्यादा जानने के लिए, क्वेरी डेटा को क्रम से लगाने का तरीका लेख पढ़ें.

डेटा फ़िल्टर करना

डेटा को फ़िल्टर करने के लिए, क्वेरी बनाते समय, सीमित या रेंज वाले किसी भी तरीके को क्रम से लगाने के तरीके के साथ जोड़ा जा सकता है.

तरीका इस्तेमाल
LimitToFirst() इससे, क्रम से लगाई गई नतीजों की सूची में सबसे पहले से दिखाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या तय की जाती है.
LimitToLast() क्रम से लगाए गए नतीजों की सूची के आखिर से दिखाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या सेट करता है.
StartAt() चुने गए क्रम के तरीके के आधार पर, तय की गई कुंजी या वैल्यू से ज़्यादा या उसके बराबर वाले आइटम दिखाता है.
EndAt() चुने गए क्रम के तरीके के आधार पर, तय की गई कुंजी या वैल्यू से कम या उसके बराबर वाले आइटम दिखाता है.
EqualTo() चुने गए क्रम के हिसाब से, तय की गई कुंजी या वैल्यू के बराबर आइटम दिखाता है.

क्रम से लगाने के तरीकों के उलट, कई सीमाएं या रेंज फ़ंक्शन जोड़े जा सकते हैं. उदाहरण के लिए, नतीजों को वैल्यू की तय सीमा तक सीमित करने के लिए, StartAt() और EndAt() तरीकों को जोड़ा जा सकता है.

क्वेरी के लिए सिर्फ़ एक मैच होने पर भी, स्नैपशॉट एक सूची ही होता है. इसमें सिर्फ़ एक आइटम होता है.

नतीजों की संख्या सीमित करना

किसी कॉलबैक के लिए, सिंक किए जाने वाले बच्चों की ज़्यादा से ज़्यादा संख्या सेट करने के लिए, LimitToFirst() और LimitToLast() तरीकों का इस्तेमाल किया जा सकता है. उदाहरण के लिए, अगर 100 की सीमा सेट करने के लिए LimitToFirst() का इस्तेमाल किया जाता है, तो शुरुआत में आपको सिर्फ़ 100 ChildAdded कॉलबैक मिलते हैं. अगर आपके Firebase डेटाबेस में 100 से कम आइटम सेव हैं, तो हर आइटम के लिए एक ChildAdded कॉलबैक ट्रिगर होता है.

आइटम में बदलाव होने पर, आपको क्वेरी में शामिल होने वाले आइटम के लिए ChildAdded कॉलबैक और उससे बाहर निकलने वाले आइटम के लिए ChildRemoved कॉलबैक मिलते हैं, ताकि कुल संख्या 100 पर बनी रहे.

उदाहरण के लिए, नीचे दिया गया कोड लीडरबोर्ड से सबसे ज़्यादा स्कोर दिखाता है:

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders").OrderByChild("score").LimitToLast(1)
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

बटन या वैल्यू के हिसाब से फ़िल्टर करना

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