पुन: प्राप्त डेटा

इस दस्तावेज़ में डेटा पुनर्प्राप्त करने की मूल बातें और Firebase डेटा को ऑर्डर और फ़िल्टर करने का तरीका शामिल है।

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

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

  • अपना एकता प्रोजेक्ट पंजीकृत करें और इसे फायरबेस का उपयोग करने के लिए कॉन्फ़िगर करें।

    • अगर आपका यूनिटी प्रोजेक्ट पहले से ही फायरबेस का उपयोग करता है, तो यह पहले से पंजीकृत है और फायरबेस के लिए कॉन्फ़िगर किया गया है।

    • यदि आपके पास एकता परियोजना नहीं है, तो आप एक नमूना ऐप डाउनलोड कर सकते हैं।

  • अपने यूनिटी प्रोजेक्ट में Firebase Unity SDK (विशेष रूप से, FirebaseDatabase.unitypackage ) जोड़ें।

ध्यान दें कि अपने यूनिटी प्रोजेक्ट में फायरबेस जोड़ने से फायरबेस कंसोल और आपके ओपन यूनिटी प्रोजेक्ट दोनों में कार्य शामिल हैं (उदाहरण के लिए, आप कंसोल से फायरबेस कॉन्फिग फाइल डाउनलोड करते हैं, फिर उन्हें अपने यूनिटी प्रोजेक्ट में ले जाते हैं)।

पुन: प्राप्त डेटा

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

एक डेटाबेस संदर्भ प्राप्त करें

डेटाबेस से डेटा पढ़ने के लिए, आपको 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 ईवेंट का उपयोग कर सकते हैं। यह घटना एक बार चालू हो जाती है जब श्रोता संलग्न होता है और फिर हर बार बच्चों सहित डेटा बदलता है। ईवेंट कॉलबैक को एक स्नैपशॉट पास किया जाता है जिसमें उस स्थान के सभी डेटा होते हैं, जिसमें चाइल्ड डेटा भी शामिल होता है। यदि कोई डेटा नहीं है, तो लौटा हुआ स्नैपशॉट 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 की भी जांच की जाती है कि क्या पठन रद्द किया गया है। उदाहरण के लिए, यदि क्लाइंट के पास फ़ायरबेस डेटाबेस स्थान से पढ़ने की अनुमति नहीं है, तो एक पठन रद्द किया जा सकता है। 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 डेटाबेस में आइटम्स की सूची को पुनः प्राप्त करने के लिए किया जाता है। ChildAdded इवेंट प्रत्येक मौजूदा बच्चे के लिए एक बार उठाया जाता है और फिर हर बार निर्दिष्ट पथ में एक नया बच्चा जोड़ा जाता है। श्रोता को एक स्नैपशॉट पास किया जाता है जिसमें नए बच्चे का डेटा होता है।

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

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

ChildMoved इवेंट तब ट्रिगर होता है जब ChildChanged इवेंट को अपडेट द्वारा उठाया जाता है जो बच्चे के पुन: क्रम का कारण बनता है। इसका उपयोग 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
    }

यह एक क्वेरी को परिभाषित करता है कि जब एक मूल्य- परिवर्तित ईवेंट श्रोता के साथ जोड़ा जाता है, तो क्लाइंट को डेटाबेस में लीडरबोर्ड के साथ सिंक्रनाइज़ करता है, प्रत्येक प्रविष्टि के स्कोर द्वारा आदेशित किया जाता है। आप स्ट्रक्चर योर डेटाबेस में अपने डेटा को कुशलतापूर्वक संरचित करने के बारे में अधिक पढ़ सकते हैं।

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() के समान हैं, सिवाय इसके कि नोड के मान का उपयोग निर्दिष्ट चाइल्ड कुंजी के मान के बजाय किया जाता है।