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

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

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

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

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

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

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

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

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

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

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