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

इस दस्तावेज़ में, डेटा को वापस पाने के बुनियादी तरीकों के बारे में बताया गया है. साथ ही, 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 =&gt {
        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 इवेंट के बाद ट्रिगर होते हैं जिसकी वजह से आइटम के क्रम में बदलाव हुआ. यह बदलाव, आपके मौजूदा order-by मेथड के आधार पर होता है.

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 इवेंट, हर मौजूदा चाइल्ड के लिए एक बार ट्रिगर होता है. इसके बाद, तय किए गए पाथ में नया चाइल्ड जोड़ने पर, यह इवेंट फिर से ट्रिगर होता है. लिसनर को एक स्नैपशॉट पास किया जाता है, जिसमें नए चाइल्ड का डेटा होता है.

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

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

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

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

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

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

क्रम से लगाए गए डेटा को वापस पाने के लिए, सबसे पहले order-by मेथड में से किसी एक को चुनें. इससे यह तय किया जा सकेगा कि नतीजों को किस क्रम में लगाया जाए:

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

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

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

      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" वैल्यू की वैल्यू के हिसाब से क्रम में लगाया जाता है. अन्य डेटा टाइप को क्रम में लगाने के तरीके के बारे में ज़्यादा जानने के लिए, क्वेरी डेटा को क्रम में लगाने का तरीका देखें.

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

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

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

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

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

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

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

OrderByChild

OrderByChild() का इस्तेमाल करने पर, जिस डेटा में चाइल्ड कुंजी की जानकारी होती है उसे इस तरह से क्रम में लगाया जाता है:

  1. जिन चाइल्ड एलिमेंट की चाइल्ड की के लिए null वैल्यू दी गई है वे पहले आते हैं.
  2. इसके बाद, वे चाइल्ड आइटम आते हैं जिनकी चाइल्ड कुंजी की वैल्यू false होती है. अगर एक से ज़्यादा चाइल्ड नोड की वैल्यू false है, तो उन्हें कुंजी के हिसाब से वर्णमाला के क्रम में लगाया जाता है.
  3. इसके बाद, वे चाइल्ड आइटम आते हैं जिनकी चाइल्ड कुंजी की वैल्यू true होती है. अगर एक से ज़्यादा चाइल्ड नोड की वैल्यू true है, तो उन्हें वर्णमाला के क्रम में लगाया जाता है.
  4. इसके बाद, संख्या वाली वैल्यू वाले चाइल्ड आइटम आते हैं. इन्हें बढ़ते क्रम में लगाया जाता है. अगर एक से ज़्यादा चाइल्ड नोड की संख्या वाली वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से क्रम में लगाया जाता है.
  5. स्ट्रिंग, संख्याओं के बाद आती हैं और उन्हें वर्णमाला के हिसाब से बढ़ते क्रम में लगाया जाता है. अगर एक से ज़्यादा चाइल्ड नोड की वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से वर्णमाला के क्रम में लगाया जाता है.
  6. ऑब्जेक्ट सबसे आखिर में आते हैं. इन्हें कुंजी के हिसाब से, वर्णमाला के बढ़ते क्रम में लगाया जाता है.

OrderByKey

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

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

OrderByValue

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