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 तरीके को कई बार कॉल करने पर गड़बड़ी होती है.
यहां दिए गए उदाहरण में बताया गया है कि किसी उपयोगकर्ता की सबसे ज़्यादा स्टार वाली पोस्ट की सूची कैसे वापस पाई जा सकती है:
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 कुंजी में नेस्ट की गई वैल्यू के हिसाब से क्रम में लगा सकते हैं. इसके लिए, हमें metrics कॉल में नेस्ट किए गए चाइल्ड का रिलेटिव पाथ तय करना होगा.queryOrderedByChild
Swift
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")
Objective-C
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];
अन्य डेटा टाइप को क्रम से लगाने के तरीके के बारे में ज़्यादा जानने के लिए, क्वेरी डेटा को क्रम से कैसे लगाया जाता है लेख पढ़ें.
डेटा फ़िल्टर करना
डेटा को फ़िल्टर करने के लिए, क्वेरी बनाते समय सीमा या रेंज के किसी भी तरीके को क्रम से लगाने के तरीके के साथ जोड़ा जा सकता है.
| तरीका | इस्तेमाल |
|---|---|
queryLimitedToFirst |
इससे, नतीजों की क्रम से लगाई गई सूची की शुरुआत से, दिखाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या सेट की जाती है. |
queryLimitedToLast |
इससे, क्रम से लगाए गए नतीजों की सूची के आखिर से, दिखाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या सेट की जाती है. |
queryStartingAtValue |
चुनी गई 'इसके हिसाब से क्रम लगाएं' विधि के आधार पर, दी गई कुंजी या वैल्यू से ज़्यादा या उसके बराबर आइटम दिखाएं. |
queryStartingAfterValue |
चुनी गई order-by विधि के आधार पर, दी गई कुंजी या वैल्यू से ज़्यादा आइटम दिखाएं. |
queryEndingAtValue |
चुनी गई 'क्रम से लगाएं' विधि के आधार पर, दी गई कुंजी या वैल्यू से कम या उसके बराबर आइटम दिखाएं. |
queryEndingBeforeValue |
चुनी गई 'इसके हिसाब से क्रम लगाएं' विधि के आधार पर, दी गई कुंजी या वैल्यू से कम वैल्यू वाले आइटम दिखाएं. |
queryEqualToValue |
चुने गए order-by तरीके के आधार पर, दी गई कुंजी या वैल्यू के बराबर आइटम दिखाएं. |
order-by के तरीकों के उलट, limit या range फ़ंक्शन को एक साथ इस्तेमाल किया जा सकता है.
उदाहरण के लिए, 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 क्लास में, ऑर्डर करने के हर तरीके से डेटा को कैसे क्रम से लगाया जाता है.
queryOrderedByKey
अपने डेटा को क्रम से लगाने के लिए queryOrderedByKey का इस्तेमाल करने पर, डेटा को कुंजी के हिसाब से बढ़ते क्रम में दिखाया जाता है.
- जिन बच्चों के पास ऐसी कुंजी है जिसे 32-बिट पूर्णांक के तौर पर पार्स किया जा सकता है उन्हें सबसे पहले दिखाया जाता है. इन्हें बढ़ते क्रम में लगाया जाता है.
- इसके बाद, उन बच्चों को दिखाया जाता है जिनकी कुंजी के तौर पर स्ट्रिंग वैल्यू होती है. इन्हें लेक्सिकोग्राफ़िक क्रम में बढ़ते क्रम में लगाया जाता है.
queryOrderedByValue
queryOrderedByValue का इस्तेमाल करने पर, बच्चों को उनकी वैल्यू के हिसाब से क्रम में लगाया जाता है. क्रम से लगाने के मानदंड, queryOrderedByChild में दिए गए मानदंडों के जैसे ही होते हैं. हालांकि, इसमें किसी तय की गई चाइल्ड की के मान के बजाय, नोड के मान का इस्तेमाल किया जाता है.
queryOrderedByChild
queryOrderedByChild का इस्तेमाल करने पर, दी गई चाइल्ड की के हिसाब से डेटा को इस तरह से क्रम में लगाया जाता है:
- जिन बच्चों के लिए, दी गई चाइल्ड की की
nilवैल्यू है वे सबसे पहले दिखते हैं. - इसके बाद, चाइल्ड की तय की गई कुंजी के लिए
falseवैल्यू वाले बच्चे दिखते हैं. अगर कई चाइल्ड मेंfalseकी वैल्यू है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. - इसके बाद, चाइल्ड की तय की गई कुंजी के लिए
trueवैल्यू वाले बच्चे दिखते हैं. अगर कई चाइल्ड मेंtrueवैल्यू है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. - इसके बाद, संख्या वाली वैल्यू वाले बच्चे आते हैं. इन्हें बढ़ते क्रम में लगाया जाता है. अगर कई चाइल्ड नोड के लिए, तय किए गए चाइल्ड नोड की संख्यात्मक वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से क्रम में लगाया जाता है.
- स्ट्रिंग, संख्याओं के बाद आती हैं. इन्हें लेक्सिकोग्राफ़िक क्रम में बढ़ते क्रम में लगाया जाता है. अगर कई बच्चों के लिए, चाइल्ड नोड की वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.
- ऑब्जेक्ट आखिर में आते हैं और उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में बढ़ते क्रम में लगाया जाता है.
लिसनर को अलग करना
जब कोई व्यक्ति ViewController छोड़ता है, तो ऑब्ज़र्वर के लिए डेटा सिंक होना अपने-आप बंद नहीं होता. अगर किसी ऑब्ज़र्वर को सही तरीके से नहीं हटाया जाता है, तो वह लोकल मेमोरी में डेटा सिंक करता रहता है. साथ ही, इवेंट हैंडलर क्लोज़र में कैप्चर किए गए ऑब्जेक्ट को बनाए रखता है. इससे मेमोरी लीक हो सकती है. जब किसी ऑब्ज़र्वर की ज़रूरत न हो, तो उससे जुड़े FIRDatabaseHandle को removeObserverWithHandle तरीके से पास करके उसे हटा दें.
किसी रेफ़रंस में कॉलबैक ब्लॉक जोड़ने पर, FIRDatabaseHandle दिखता है.
इन हैंडल का इस्तेमाल करके, कॉलबैक ब्लॉक को हटाया जा सकता है.
अगर किसी डेटाबेस रेफ़रंस में कई लिसनर जोड़े गए हैं, तो इवेंट ट्रिगर होने पर हर लिसनर को कॉल किया जाता है. उस जगह पर डेटा सिंक होने से रोकने के लिए, आपको removeAllObservers तरीके का इस्तेमाल करके, उस जगह पर मौजूद सभी ऑब्ज़र्वर को हटाना होगा.
लिसनर पर removeObserverWithHandle या removeAllObservers को कॉल करने से, उसके चाइल्ड नोड पर रजिस्टर किए गए लिसनर अपने-आप नहीं हटते. आपको उन्हें हटाने के लिए, उन रेफ़रंस या हैंडल का भी ध्यान रखना होगा.