FIRDatabaseReference पाना
डेटाबेस से डेटा पढ़ने या उसमें डेटा लिखने के लिए, आपको FIRDatabaseReference के इंस्टेंस की ज़रूरत होगी:
Swift
var ref: DatabaseReference! ref = Database.database().reference()
Objective-C
@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
सूचियां पढ़ना और लिखना
डेटा की सूची में जोड़ना
एक से ज़्यादा उपयोगकर्ताओं वाले ऐप्लिकेशन में, किसी सूची में डेटा जोड़ने के लिए childByAutoId तरीके का इस्तेमाल करें. childByAutoId मेथड, Firebase के किसी रेफ़रंस में नया चाइल्ड जोड़ने पर हर बार एक यूनीक कुंजी जनरेट करता है. सूची में मौजूद हर नए एलिमेंट के लिए, अपने-आप जनरेट होने वाली इन कुंजियों का इस्तेमाल करके, कई क्लाइंट एक ही समय पर एक ही जगह पर चाइल्ड एलिमेंट जोड़ सकते हैं. इससे, डेटा लिखने में कोई समस्या नहीं होती. childByAutoId से जनरेट की गई यूनीक कुंजी, टाइमस्टैंप पर आधारित होती है. इसलिए, सूची के आइटम अपने-आप समय के हिसाब से क्रम में लग जाते हैं.
childByAutoId तरीके से मिले नए डेटा के रेफ़रंस का इस्तेमाल करके, चाइल्ड की अपने-आप जनरेट हुई कुंजी की वैल्यू पाई जा सकती है या चाइल्ड के लिए डेटा सेट किया जा सकता है.
childByAutoId रेफ़रंस पर getKey को कॉल करने पर, अपने-आप जनरेट हुई कुंजी मिलती है.
अपने-आप जनरेट होने वाली इन कुंजियों का इस्तेमाल करके, डेटा स्ट्रक्चर को फ़्लैट करने की प्रोसेस को आसान बनाया जा सकता है. ज़्यादा जानकारी के लिए, डेटा फ़ैन-आउट का उदाहरण देखें.
चाइल्ड इवेंट को मॉनिटर करना
चाइल्ड इवेंट, किसी नोड के चाइल्ड पर होने वाली खास कार्रवाइयों के जवाब में ट्रिगर होते हैं. जैसे, childByAutoId तरीके से नया चाइल्ड जोड़ना या updateChildValues तरीके से किसी चाइल्ड को अपडेट करना.
| इवेंट प्रकार | आम तौर पर इस्तेमाल |
|---|---|
FIRDataEventTypeChildAdded |
आइटम की सूचियाँ वापस पाना या आइटम की सूची में जोड़े गए आइटम के बारे में सुनना. यह इवेंट, हर मौजूदा चाइल्ड के लिए एक बार ट्रिगर होता है. इसके बाद, तय किए गए पाथ में नया चाइल्ड जोड़ने पर, यह हर बार ट्रिगर होता है. लिसनर को एक स्नैपशॉट पास किया जाता है, जिसमें नए चाइल्ड का डेटा होता है. |
FIRDataEventTypeChildChanged |
सूची में मौजूद आइटम में होने वाले बदलावों को सुनें. यह इवेंट तब ट्रिगर होता है, जब किसी चाइल्ड नोड में बदलाव किया जाता है. इसमें चाइल्ड नोड के डिसेंडेंट में किए गए बदलाव भी शामिल हैं. इवेंट लिसनर को पास किए गए स्नैपशॉट में, चाइल्ड के लिए अपडेट किया गया डेटा शामिल होता है. |
FIRDataEventTypeChildRemoved |
सूची से आइटम हटाए जाने पर सूचना पाएं. यह इवेंट तब ट्रिगर होता है, जब किसी चाइल्ड नोड को हटाया जाता है.कॉलबैक ब्लॉक को पास किए गए स्नैपशॉट में, हटाए गए चाइल्ड नोड का डेटा होता है. |
FIRDataEventTypeChildMoved |
क्रम वाली सूची में आइटम के क्रम में होने वाले बदलावों को सुनें.
यह इवेंट तब ट्रिगर होता है, जब किसी अपडेट की वजह से चाइल्ड एलिमेंट का क्रम बदल जाता है. इसका इस्तेमाल, queryOrderedByChild
या queryOrderedByValue के हिसाब से क्रम में लगाए गए डेटा के साथ किया जाता है.
|
इन सभी का इस्तेमाल करके, डेटाबेस में किसी खास नोड में होने वाले बदलावों को सुना जा सकता है. उदाहरण के लिए, कोई सोशल ब्लॉगिंग ऐप्लिकेशन, किसी पोस्ट की टिप्पणियों में होने वाली गतिविधि पर नज़र रखने के लिए, इन तरीकों का एक साथ इस्तेमाल कर सकता है. इसके बारे में यहां बताया गया है:
Swift
// Listen for new comments in the Firebase database commentsRef.observe(.childAdded, with: { (snapshot) -> Void in self.comments.append(snapshot) self.tableView.insertRows( at: [IndexPath(row: self.comments.count - 1, section: self.kSectionComments)], with: UITableView.RowAnimation.automatic ) }) // Listen for deleted comments in the Firebase database commentsRef.observe(.childRemoved, with: { (snapshot) -> Void in let index = self.indexOfMessage(snapshot) self.comments.remove(at: index) self.tableView.deleteRows( at: [IndexPath(row: index, section: self.kSectionComments)], with: UITableView.RowAnimation.automatic ) })
Objective-C
// Listen for new comments in the Firebase database [_commentsRef observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) { [self.comments addObject:snapshot]; [self.tableView insertRowsAtIndexPaths:@[ [NSIndexPath indexPathForRow:self.comments.count - 1 inSection:kSectionComments] ] withRowAnimation:UITableViewRowAnimationAutomatic]; }]; // Listen for deleted comments in the Firebase database [_commentsRef observeEventType:FIRDataEventTypeChildRemoved withBlock:^(FIRDataSnapshot *snapshot) { int index = [self indexOfMessage:snapshot]; [self.comments removeObjectAtIndex:index]; [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:kSectionComments]] withRowAnimation:UITableViewRowAnimationAutomatic]; }];
वैल्यू इवेंट को मॉनिटर करने की अनुमति
डेटा की सूचियां पढ़ने के लिए, चाइल्ड इवेंट को मॉनिटर करने का सुझाव दिया जाता है. हालांकि, कुछ मामलों में सूची के रेफ़रंस पर वैल्यू इवेंट को मॉनिटर करना भी फ़ायदेमंद होता है.
डेटा की सूची में FIRDataEventTypeValue ऑब्ज़र्वर अटैच करने पर, डेटा की पूरी सूची एक DataSnapshot के तौर पर दिखेगी. इसके बाद, अलग-अलग चाइल्ड नोड को ऐक्सेस करने के लिए, इस सूची को लूप किया जा सकता है.
क्वेरी के लिए सिर्फ़ एक मैच होने पर भी, स्नैपशॉट एक सूची के तौर पर ही दिखता है. इसमें सिर्फ़ एक आइटम होता है. आइटम को ऐक्सेस करने के लिए, आपको नतीजे को लूप करना होगा:
Swift
_commentsRef.observe(.value) { snapshot in for child in snapshot.children { ... } }
Objective-C
[_commentsRef observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { // Loop over children NSEnumerator *children = [snapshot children]; FIRDataSnapshot *child; while (child = [children nextObject]) { // ... } }];
यह पैटर्न तब काम आ सकता है, जब आपको एक ही कार्रवाई में सूची के सभी चाइल्ड नोड फ़ेच करने हों. इससे आपको चाइल्ड नोड जोड़े जाने के अतिरिक्त इवेंट सुनने की ज़रूरत नहीं पड़ती.
डेटा को क्रम से लगाना और फ़िल्टर करना
Realtime Database FIRDatabaseQuery क्लास का इस्तेमाल करके, कुंजी, वैल्यू या चाइल्ड की वैल्यू के हिसाब से क्रम में लगाया गया डेटा वापस पाया जा सकता है. क्रम से लगाए गए नतीजों को, नतीजों की किसी खास संख्या या कुंजियों या वैल्यू की रेंज के हिसाब से भी फ़िल्टर किया जा सकता है.
डेटा को क्रम से लगाना
क्रम से लगाए गए डेटा को वापस पाने के लिए, सबसे पहले order-by मेथड में से किसी एक को चुनें. इससे यह तय किया जा सकेगा कि नतीजों को किस क्रम में लगाया जाए:
| तरीका | इस्तेमाल |
|---|---|
queryOrderedByKey
| चाइल्ड की के हिसाब से नतीजों को क्रम में लगाएं. |
queryOrderedByValue |
चाइल्ड वैल्यू के हिसाब से नतीजों को क्रम में लगाएं. |
queryOrderedByChild |
नतीजों को किसी चाइल्ड कुंजी या नेस्ट किए गए चाइल्ड पाथ की वैल्यू के हिसाब से क्रम में लगाएं. |
एक बार में सिर्फ़ एक order-by मेथड का इस्तेमाल किया जा सकता है. एक ही क्वेरी में, order-by मेथड को कई बार कॉल करने पर गड़बड़ी होती है.
यहां दिए गए उदाहरण में, किसी उपयोगकर्ता की सबसे लोकप्रिय पोस्ट की सूची को स्टार की संख्या के हिसाब से क्रम में लगाने का तरीका बताया गया है:
Swift
// My top posts by number of stars let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")
Objective-C
// My top posts by number of stars FIRDatabaseQuery *myTopPostsQuery = [[[self.ref child:@"user-posts"] child:[super getUid]] queryOrderedByChild:@"starCount"];
यह क्वेरी, डेटाबेस में मौजूद पाथ से उपयोगकर्ता की पोस्ट को फ़ेच करती है. यह पाथ, उपयोगकर्ता के यूज़र आईडी पर आधारित होता है. पोस्ट को उनके स्टार की संख्या के हिसाब से क्रम में लगाया जाता है. आईडी को इंडेक्स कुंजी के तौर पर इस्तेमाल करने की इस तकनीक को डेटा फ़ैन आउट कहा जाता है. इसके बारे में ज़्यादा जानने के लिए, अपने डेटाबेस को व्यवस्थित करें लेख पढ़ें.
queryOrderedByChild वाले तरीके को कॉल करने पर, चाइल्ड कुंजी के हिसाब से नतीजों को क्रम में लगाया जाता है. इस उदाहरण में, पोस्ट को हर पोस्ट में मौजूद "starCount" चाइल्ड की वैल्यू के हिसाब से क्रम में लगाया गया है. क्वेरी को नेस्ट किए गए चाइल्ड के हिसाब से भी क्रम में लगाया जा सकता है. ऐसा तब किया जा सकता है, जब आपके पास इस तरह का डेटा हो:
"posts": {
"ts-functions": {
"metrics": {
"views" : 1200000,
"likes" : 251000,
"shares": 1200,
},
"title" : "Why you should use TypeScript for writing Cloud Functions",
"author": "Doug",
},
"android-arch-3": {
"metrics": {
"views" : 900000,
"likes" : 117000,
"shares": 144,
},
"title" : "Using Android Architecture Components with Firebase Realtime Database (Part 3)",
"author": "Doug",
}
},इस मामले में, हम metrics कुंजी के तहत नेस्ट की गई वैल्यू के हिसाब से, सूची के एलिमेंट को क्रम से लगा सकते हैं. इसके लिए, हमें queryOrderedByChild कॉल में नेस्ट किए गए चाइल्ड का रिलेटिव पाथ बताना होगा.
Swift
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")
Objective-C
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];
अन्य डेटा टाइप को क्रम में लगाने के तरीके के बारे में ज़्यादा जानने के लिए, क्वेरी डेटा को क्रम में लगाने का तरीका देखें.
डेटा फ़िल्टर करना
डेटा को फ़िल्टर करने के लिए, क्वेरी बनाते समय, लिमिट या रेंज के किसी भी तरीके को order-by मेथड के साथ जोड़ा जा सकता है.
| तरीका | इस्तेमाल |
|---|---|
queryLimitedToFirst |
इससे, नतीजों की क्रम वाली सूची की शुरुआत से दिखाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या सेट की जाती है. |
queryLimitedToLast |
इससे नतीजों की क्रम वाली सूची के आखिर से, ज़्यादा से ज़्यादा आइटम की संख्या सेट की जाती है. |
queryStartingAtValue |
चुने गए order-by मेथड के आधार पर, तय की गई कुंजी या वैल्यू से ज़्यादा या उसके बराबर आइटम दिखाता है. |
queryStartingAfterValue |
चुने गए order-by मेथड के आधार पर, तय की गई कुंजी या वैल्यू से ज़्यादा वैल्यू वाले आइटम दिखाता है. |
queryEndingAtValue |
चुने गए order-by मेथड के आधार पर, तय की गई कुंजी या वैल्यू से कम या उसके बराबर वाले आइटम दिखाता है. |
queryEndingBeforeValue |
चुने गए order-by मेथड के आधार पर, तय की गई कुंजी या वैल्यू से कम वैल्यू वाले आइटम दिखाता है. |
queryEqualToValue |
चुने गए order-by मेथड के आधार पर, तय की गई कुंजी या वैल्यू के बराबर आइटम दिखाएं. |
order-by मेथड के उलट, कई लिमिट या रेंज फ़ंक्शन को जोड़ा जा सकता है.
उदाहरण के लिए, queryStartingAtValue और queryEndingAtValue तरीकों को जोड़कर, नतीजों को वैल्यू की तय की गई रेंज तक सीमित किया जा सकता है.
नतीजों की संख्या सीमित करना
queryLimitedToFirst और queryLimitedToLast तरीकों का इस्तेमाल करके, किसी कॉलबैक के लिए सिंक किए जाने वाले चाइल्ड व्यू की ज़्यादा से ज़्यादा संख्या सेट की जा सकती है. उदाहरण के लिए, अगर queryLimitedToFirst का इस्तेमाल करके 100 की सीमा सेट की जाती है, तो आपको शुरुआत में सिर्फ़ 100 FIRDataEventTypeChildAdded कॉलबैक मिलेंगे. अगर आपके Firebase डेटाबेस में 100 से कम आइटम सेव हैं, तो हर आइटम के लिए एक FIRDataEventTypeChildAdded कॉलबैक ट्रिगर होता है.
आइटम बदलने पर, आपको क्वेरी में शामिल होने वाले आइटम के लिए FIRDataEventTypeChildAdded कॉलबैक और उससे बाहर होने वाले आइटम के लिए FIRDataEventTypeChildRemoved कॉलबैक मिलते हैं. इससे आइटम की कुल संख्या 100 बनी रहती है.
यहां दिए गए उदाहरण में बताया गया है कि ब्लॉगिंग ऐप्लिकेशन, सभी उपयोगकर्ताओं की 100 सबसे हाल की पोस्ट की सूची कैसे वापस पा सकता है:
Swift
// Last 100 posts, these are automatically the 100 most recent // due to sorting by push() keys let recentPostsQuery = (ref?.child("posts").queryLimited(toFirst: 100))!
Objective-C
// Last 100 posts, these are automatically the 100 most recent // due to sorting by push() keys FIRDatabaseQuery *recentPostsQuery = [[self.ref child:@"posts"] queryLimitedToFirst:100];
कुंजी या वैल्यू के हिसाब से फ़िल्टर करें
क्वेरी के लिए, अपनी पसंद के मुताबिक शुरुआती, आखिरी, और बराबर पॉइंट चुनने के लिए, queryStartingAtValue, queryStartingAfterValue, queryEndingAtValue, queryEndingBeforeValue, और queryEqualToValue का इस्तेमाल किया जा सकता है. यह डेटा को पेज में बांटने या ऐसे चाइल्ड नोड वाले आइटम ढूंढने के लिए मददगार हो सकता है जिनकी वैल्यू खास हो.
क्वेरी डेटा को कैसे क्रम में लगाया जाता है
इस सेक्शन में बताया गया है कि FIRDatabaseQuery क्लास में, हर order-by मेथड के हिसाब से डेटा को कैसे क्रम से लगाया जाता है.
queryOrderedByKey
डेटा को क्रम से लगाने के लिए queryOrderedByKey का इस्तेमाल करने पर, डेटा को कुंजी के हिसाब से बढ़ते क्रम में दिखाया जाता है.
- सबसे पहले, ऐसी कुंजी वाले चाइल्ड एलिमेंट आते हैं जिन्हें 32-बिट पूर्णांक के तौर पर पार्स किया जा सकता है. इन्हें बढ़ते क्रम में लगाया जाता है.
- इसके बाद, स्ट्रिंग वैल्यू वाली कुंजी वाले चाइल्ड आइटम आते हैं. इन्हें वर्णमाला के हिसाब से बढ़ते क्रम में लगाया जाता है.
queryOrderedByValue
queryOrderedByValue का इस्तेमाल करने पर, चाइल्ड एलिमेंट को उनकी वैल्यू के हिसाब से क्रम में लगाया जाता है. क्रम तय करने की शर्तें, queryOrderedByChild की तरह ही होती हैं. हालांकि, इसमें किसी चाइल्ड कुंजी की वैल्यू के बजाय, नोड की वैल्यू का इस्तेमाल किया जाता है.
queryOrderedByChild
queryOrderedByChild का इस्तेमाल करने पर, जिस डेटा में चाइल्ड कुंजी मौजूद होती है उसे इस तरह क्रम में लगाया जाता है:
- जिन चाइल्ड एलिमेंट की चाइल्ड की के लिए
nilवैल्यू दी गई है वे पहले आते हैं. - इसके बाद, वे चाइल्ड आइटम आते हैं जिनकी चाइल्ड कुंजी की वैल्यू
falseहोती है. अगर एक से ज़्यादा चाइल्ड नोड की वैल्यूfalseहै, तो उन्हें कुंजी के हिसाब से वर्णमाला के क्रम में लगाया जाता है. - इसके बाद, वे चाइल्ड आइटम आते हैं जिनकी चाइल्ड कुंजी की वैल्यू
trueहोती है. अगर एक से ज़्यादा चाइल्ड नोड की वैल्यूtrueहै, तो उन्हें वर्णमाला के क्रम में लगाया जाता है. - इसके बाद, संख्या वाली वैल्यू वाले चाइल्ड आइटम आते हैं. इन्हें बढ़ते क्रम में लगाया जाता है. अगर एक से ज़्यादा चाइल्ड नोड की संख्या वाली वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से क्रम में लगाया जाता है.
- स्ट्रिंग, संख्याओं के बाद आती हैं और उन्हें वर्णमाला के हिसाब से बढ़ते क्रम में लगाया जाता है. अगर एक से ज़्यादा चाइल्ड नोड की वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से वर्णमाला के क्रम में लगाया जाता है.
- ऑब्जेक्ट सबसे आखिर में आते हैं. इन्हें कुंजी के हिसाब से, वर्णमाला के बढ़ते क्रम में लगाया जाता है.
लिसनर को अलग करना
ViewController छोड़ने पर, ऑब्ज़र्वर डेटा को सिंक करना अपने-आप बंद नहीं करते. अगर किसी ऑब्ज़र्वर को सही तरीके से नहीं हटाया जाता है, तो वह लोकल मेमोरी में डेटा सिंक करता रहता है. साथ ही, इवेंट हैंडलर क्लोज़र में कैप्चर किए गए किसी भी ऑब्जेक्ट को बनाए रखता है. इससे मेमोरी लीक हो सकती है. जब ऑब्ज़र्वर की ज़रूरत न हो, तो उससे जुड़े FIRDatabaseHandle को removeObserverWithHandle तरीके में पास करके उसे हटाएं.
किसी रेफ़रंस में कॉलबैक ब्लॉक जोड़ने पर, FIRDatabaseHandle मिलता है.
इन हैंडल का इस्तेमाल करके, कॉलबैक ब्लॉक को हटाया जा सकता है.
अगर किसी डेटाबेस रेफ़रंस में कई लिसनर जोड़े गए हैं, तो कोई इवेंट होने पर हर लिसनर को कॉल किया जाता है. उस जगह पर डेटा सिंक करना बंद करने के लिए, आपको removeAllObservers तरीके को कॉल करके, उस जगह पर मौजूद सभी ऑब्ज़र्वर को हटाना होगा.
किसी लिसनर पर removeObserverWithHandle या removeAllObservers को कॉल करने से, उसके चाइल्ड नोड पर रजिस्टर किए गए लिसनर अपने-आप नहीं हटते. उन्हें हटाने के लिए, आपको उन रेफ़रंस या हैंडल को भी ट्रैक करना होगा.