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

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

जब भी चाइल्ड नोड में बदलाव किया जाता है, 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
    }

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

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