डेटा फ़ेच किया जा रहा है

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

वेब कंटेनर इंस्टॉल करने से पहले

रीयलटाइम डेटाबेस का इस्तेमाल करने से पहले, आपको ये काम करने होंगे:

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

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

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

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

ध्यान दें कि 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 इवेंट के बाद आते हैं जिसकी वजह से आइटम का क्रम बदल गया है. यह आपके मौजूदा ऑर्डर के हिसाब से तय होता है.

ValueChange किया गया इवेंट

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

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

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

कुंजी, वैल्यू या बच्चे की वैल्यू के हिसाब से क्रम में लगाए गए डेटा को वापस पाने के लिए, रीयलटाइम डेटाबेस 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
    }

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

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

OrderByKey

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

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

OrderByValue

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