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