इस दस्तावेज़ में, डेटा वापस पाने की बुनियादी जानकारी दी गई है. साथ ही, इसमें Firebase के डेटा को क्रम से लगाने और फ़िल्टर करने का तरीका बताया गया है.
शुरू करने से पहले
Realtime Database का इस्तेमाल करने से पहले, Realtime Database, आपको ये काम करने होंगे:
अपने यूनिटी प्रोजेक्ट को रजिस्टर करें और उसे Firebase का इस्तेमाल करने के लिए कॉन्फ़िगर करें.
अगर आपका यूनिटी प्रोजेक्ट पहले से ही Firebase का इस्तेमाल करता है, तो वह पहले से ही Firebase के लिए रजिस्टर और कॉन्फ़िगर किया गया है.
अगर आपके पास कोई यूनिटी प्रोजेक्ट नहीं है, तो आप एक सैंपल ऐप्लिकेशन डाउनलोड कर सकते हैं.
अपने यूनिटी प्रोजेक्ट में, Firebase Unity SDK (खास तौर पर,
FirebaseDatabase.unitypackage) जोड़ें.
ध्यान दें कि अपने यूनिटी प्रोजेक्ट में Firebase जोड़ने के लिए, Firebase कंसोल और खुले हुए यूनिटी प्रोजेक्ट, दोनों में टास्क पूरे करने होते हैं (उदाहरण के लिए, Firebase कंसोल से Firebase कॉन्फ़िगरेशन फ़ाइलें डाउनलोड की जाती हैं. इसके बाद, उन्हें अपने यूनिटी प्रोजेक्ट में ले जाया जाता है).
डेटा वापस लाया जा रहा है
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 इवेंट के बाद होते हैं. 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 }
The ChildAdded
इवेंट का इस्तेमाल आम तौर पर, Firebase डेटाबेस में आइटम की सूची वापस पाने के लिए किया जाता है. ChildAdded इवेंट, हर मौजूदा चाइल्ड के लिए एक बार ट्रिगर होता है. इसके बाद, तय किए गए पाथ में नया चाइल्ड जोड़े जाने पर हर बार ट्रिगर होता है. लिसनर को, नए चाइल्ड का डेटा वाला स्नैपशॉट पास किया जाता है.
The ChildChanged
इवेंट, चाइल्ड नोड में बदलाव होने पर हर बार ट्रिगर होता है.
इसमें चाइल्ड नोड के डिसेंडेंट में होने वाले सभी बदलाव शामिल होते हैं. इसका इस्तेमाल आम तौर पर, आइटम की सूची में होने वाले बदलावों के जवाब में, ChildAdded और ChildRemoved इवेंट के साथ किया जाता है. इवेंट लिसनर को पास किए गए स्नैपशॉट में, चाइल्ड के लिए अपडेट किया गया डेटा होता है.
The ChildRemoved
इवेंट, किसी चाइल्ड को हटाने पर ट्रिगर होता है.
इसका इस्तेमाल आम तौर पर, ChildAdded और ChildChanged कॉलबैक के साथ किया जाता है. इवेंट कॉलबैक को पास किए गए स्नैपशॉट में, हटाए गए चाइल्ड का डेटा होता है.
ChildMoved
इवेंट, ChildChanged
इवेंट के ट्रिगर होने पर ट्रिगर होता है. ChildChanged
इवेंट, किसी अपडेट की वजह से ट्रिगर होता है. इस अपडेट की वजह से, चाइल्ड का क्रम बदल जाता है. इसका इस्तेमाल, 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 }
इससे एक क्वेरी तय होती है. जब इसे valuechanged इवेंट लिसनर के साथ जोड़ा जाता है, तो यह क्लाइंट को डेटाबेस में मौजूद लीडरबोर्ड के साथ सिंक करता है. यह लीडरबोर्ड, हर एंट्री के स्कोर के हिसाब से क्रम से लगाया जाता है. अपने डेटा को बेहतर तरीके से स्ट्रक्चर करने के बारे में ज़्यादा जानने के लिए, अपने डेटाबेस को स्ट्रक्चर करना लेख पढ़ें.
OrderByChild() तरीके को कॉल करने पर, उस चाइल्ड कुंजी को तय किया जाता है जिसके हिसाब से नतीजों को क्रम से लगाना है. इस मामले में, नतीजों को हर चाइल्ड में मौजूद "score"
वैल्यू के हिसाब से क्रम से लगाया जाता है. अन्य डेटा टाइप को क्रम से लगाने के तरीके के बारे में ज़्यादा जानने के लिए,
क्वेरी के डेटा को क्रम से कैसे लगाया जाता है लेख पढ़ें.
डेटा को फ़िल्टर करना
डेटा को फ़िल्टर करने के लिए, क्वेरी बनाते समय, सीमा या रेंज के किसी भी तरीके को क्रम से लगाने के किसी तरीके के साथ जोड़ा जा सकता है.
| तरीका | इस्तेमाल |
|---|---|
LimitToFirst() |
नतीजों की क्रम से लगाई गई सूची की शुरुआत से, लौटाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या सेट करता है. |
LimitToLast() |
नतीजों की क्रम से लगाई गई सूची के आखिर से, लौटाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या सेट करता है. |
StartAt() |
क्रम से लगाने के चुने गए तरीके के आधार पर, तय की गई कुंजी या वैल्यू से ज़्यादा या उसके बराबर वाले आइटम लौटाता है. |
EndAt() |
क्रम से लगाने के चुने गए तरीके के आधार पर, तय की गई कुंजी या वैल्यू से कम या उसके बराबर वाले आइटम लौटाता है. |
EqualTo() |
क्रम से लगाने के चुने गए तरीके के आधार पर, तय की गई कुंजी या वैल्यू के बराबर वाले आइटम लौटाता है. |
क्रम से लगाने के तरीकों के उलट, सीमा या रेंज के कई फ़ंक्शन को जोड़ा जा सकता है.
उदाहरण के लिए, वैल्यू की तय की गई रेंज के हिसाब से नतीजों को सीमित करने के लिए, 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 क्लास में, क्रम से लगाने के हर तरीके से डेटा को कैसे क्रम से लगाया जाता है.
OrderByChild
OrderByChild()
का इस्तेमाल करने पर, तय की गई चाइल्ड कुंजी वाला डेटा इस तरह क्रम से लगाया जाता है:
- तय की गई चाइल्ड कुंजी के लिए
nullवैल्यू वाले चाइल्ड सबसे पहले आते हैं. - तय की गई चाइल्ड कुंजी के लिए
falseवैल्यू वाले चाइल्ड इसके बाद आते हैं. अगर कई चाइल्ड की वैल्यूfalseहै, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. - तय की गई चाइल्ड कुंजी के लिए
trueवैल्यू वाले चाइल्ड इसके बाद आते हैं. अगर कई चाइल्ड की वैल्यूtrueहै, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. - न्यूमेरिक वैल्यू वाले चाइल्ड इसके बाद आते हैं. इन्हें बढ़ते क्रम में लगाया जाता है. अगर तय किए गए चाइल्ड नोड के लिए कई चाइल्ड की न्यूमेरिकल वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से क्रम से लगाया जाता है.
- स्ट्रिंग, नंबर के बाद आती हैं और इन्हें बढ़ते क्रम में लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. अगर तय किए गए चाइल्ड नोड के लिए कई चाइल्ड की वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.
- ऑब्जेक्ट सबसे आखिर में आते हैं और इन्हें बढ़ते क्रम में कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.
OrderByKey
अपने डेटा को क्रम से लगाने के लिए OrderByKey()
का इस्तेमाल करने पर, डेटा को कुंजी के हिसाब से बढ़ते क्रम में लौटाया जाता है.
- वे चाइल्ड सबसे पहले आते हैं जिनकी कुंजी को 32-बिट इंटिजर के तौर पर पार्स किया जा सकता है. इन्हें बढ़ते क्रम में लगाया जाता है.
- वे चाइल्ड इसके बाद आते हैं जिनकी कुंजी के तौर पर स्ट्रिंग वैल्यू होती है. इन्हें बढ़ते क्रम में लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.
OrderByValue
OrderByValue()
का इस्तेमाल करने पर, चाइल्ड को उनकी वैल्यू के हिसाब से क्रम से लगाया जाता है. क्रम से लगाने के मानदंड, OrderByChild() के जैसे ही होते हैं. हालांकि, इसमें तय की गई चाइल्ड कुंजी की वैल्यू के बजाय, नोड की वैल्यू का इस्तेमाल किया जाता है.