इस दस्तावेज़ में, डेटा वापस पाने और 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 कॉलबैक के साथ किया जाता है. इवेंट कॉलबैक को पास किए गए स्नैपशॉट में, हटाए गए चाइल्ड का डेटा होता है.
ChildMoved इवेंट तब ट्रिगर होता है, जब ChildChanged इवेंट को किसी ऐसे अपडेट से ट्रिगर किया जाता है जिसकी वजह से चाइल्ड प्रॉडक्ट का क्रम बदल जाता है. इसका इस्तेमाल, OrderByChild या OrderByValue के साथ क्रम से लगाए गए डेटा के साथ किया जाता है.
डेटा को क्रम से लगाना और फ़िल्टर करना
Realtime Database Query क्लास का इस्तेमाल करके, कुंजी, वैल्यू या चाइल्ड की वैल्यू के हिसाब से क्रम से लगाया गया डेटा वापस पाया जा सकता है. क्रम से लगाए गए नतीजों को, नतीजों की किसी खास संख्या या कुंजियों या वैल्यू की किसी सीमा के हिसाब से भी फ़िल्टर किया जा सकता है.
डेटा को क्रम से लगाना
क्रम से लगाया गया डेटा वापस पाने के लिए, सबसे पहले क्रम से लगाने के तरीकों में से किसी एक को तय करें. इससे यह तय किया जा सकेगा कि नतीजों को किस क्रम में लगाया जाए:
| तरीका | इस्तेमाल |
|---|---|
OrderByChild() |
किसी खास चाइल्ड की के हिसाब से नतीजों को क्रम से लगाएं. |
OrderByKey()
| चाइल्ड की के हिसाब से नतीजों को क्रम से लगाएं. |
OrderByValue() |
नतीजों को चाइल्ड वैल्यू के हिसाब से क्रम में लगाएं. |
एक बार में, सिर्फ़ एक order-by तरीके का इस्तेमाल किया जा सकता है. एक ही क्वेरी में, order-by तरीके को कई बार कॉल करने पर गड़बड़ी होती है.
यहां दिए गए उदाहरण में, स्कोर के हिसाब से क्रम में लगे स्कोर लीडरबोर्ड पर सदस्यता लेने का तरीका बताया गया है.
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() |
चुनी गई order-by विधि के आधार पर, दी गई कुंजी या वैल्यू से ज़्यादा या उसके बराबर आइटम दिखाएं. |
EndAt() |
चुनी गई order-by विधि के आधार पर, तय की गई कुंजी या वैल्यू से कम या उसके बराबर आइटम दिखाएं. |
EqualTo() |
चुनी गई order-by विधि के आधार पर, दी गई कुंजी या वैल्यू के बराबर आइटम दिखाएं. |
order-by के तरीकों के उलट, limit या range फ़ंक्शन को एक साथ इस्तेमाल किया जा सकता है.
उदाहरण के लिए, 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 क्लास में, order-by के हर तरीके से डेटा को कैसे क्रम में लगाया जाता है.
OrderByChild
OrderByChild() का इस्तेमाल करने पर, तय की गई चाइल्ड की वाली वैल्यू के हिसाब से डेटा को इस तरह क्रम में लगाया जाता है:
- जिन बच्चों के लिए, तय की गई चाइल्ड की वैल्यू
nullहोती है उन्हें सबसे पहले दिखाया जाता है. - इसके बाद, उन बच्चों को शामिल किया जाता है जिनकी वैल्यू, तय की गई चाइल्ड की के लिए
falseहै. अगर कई चाइल्ड मेंfalseकी वैल्यू है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. - इसके बाद, उन बच्चों को शामिल किया जाता है जिनकी वैल्यू, तय की गई चाइल्ड की के लिए
trueहै. अगर एक से ज़्यादा चाइल्ड मेंtrueवैल्यू है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. - इसके बाद, संख्या वाली वैल्यू वाले बच्चे बढ़ते क्रम में दिखते हैं. अगर कई चाइल्ड नोड के लिए, तय किए गए चाइल्ड नोड की संख्यात्मक वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से क्रम में लगाया जाता है.
- स्ट्रिंग, संख्याओं के बाद आती हैं और इन्हें लेक्सिकोग्राफ़िक क्रम में बढ़ते क्रम में लगाया जाता है. अगर कई बच्चों के लिए, चाइल्ड नोड की वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.
- ऑब्जेक्ट आखिर में आते हैं और उन्हें कुंजी के हिसाब से, लेक्सिकोग्राफ़िक क्रम में बढ़ते क्रम में लगाया जाता है.
OrderByKey
अपने डेटा को क्रम से लगाने के लिए OrderByKey() का इस्तेमाल करने पर, डेटा को कुंजी के हिसाब से बढ़ते क्रम में दिखाया जाता है.
- जिन बच्चों के पास ऐसी कुंजी होती है जिसे 32-बिट पूर्णांक के तौर पर पार्स किया जा सकता है उन्हें सबसे पहले दिखाया जाता है. इन्हें बढ़ते क्रम में क्रमबद्ध किया जाता है.
- इसके बाद, उन बच्चों को दिखाया जाता है जिनकी कुंजी के तौर पर स्ट्रिंग वैल्यू होती है. इन्हें लेक्सिकोग्राफ़िक तरीके से बढ़ते क्रम में लगाया जाता है.
OrderByValue
OrderByValue() का इस्तेमाल करने पर, बच्चों को उनकी वैल्यू के हिसाब से क्रम में लगाया जाता है. क्रम से लगाने की शर्तें, OrderByChild() में दी गई शर्तों के जैसी ही होती हैं. हालांकि, इसमें किसी तय की गई चाइल्ड की के बजाय नोड की वैल्यू का इस्तेमाल किया जाता है.