FIRDatabaseReference पाएं
डेटाबेस से डेटा पढ़ने या उसमें बदलाव करने के लिए, आपके पास FIRDatabaseReference
का एक इंस्टेंस होना चाहिए:
Swift
var ref: DatabaseReference! ref = Database.database().reference()
Objective-C
@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
पढ़ने और लिखने की सूचियां
डेटा की सूची में जोड़ें
एक से ज़्यादा उपयोगकर्ताओं वाले ऐप्लिकेशन की सूची में डेटा जोड़ने के लिए, childByAutoId
तरीके का इस्तेमाल करें. जब भी तय Firebase संदर्भ में किसी नए बच्चे को जोड़ा जाता है, तब childByAutoId
वाला तरीका एक यूनीक कुंजी जनरेट करता है. सूची में मौजूद हर नए एलिमेंट के लिए, अपने-आप जनरेट होने वाली इन कुंजियों का इस्तेमाल करके, कई क्लाइंट एक ही समय में बच्चों को एक ही जगह पर जोड़ सकते हैं. इससे, उन्हें एक ही समय पर अलग-अलग कोड लिखने की सुविधा नहीं मिलती. 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]) { // ... } }];
यह पैटर्न तब काम का हो सकता है, जब आपको एक ही कार्रवाई में सूची के सभी चाइल्ड एंट्री को फ़ेच करना हो. इससे, बच्चे के जोड़े गए अन्य इवेंट को सुनने के बजाय, उन्हें फ़ेच किया जा सकता है.
डेटा को क्रम से लगाना और फ़िल्टर करना
कुंजी, वैल्यू या बच्चे की वैल्यू के हिसाब से क्रम में लगाए गए डेटा को वापस पाने के लिए, रीयलटाइम डेटाबेस FIRDatabaseQuery
क्लास का इस्तेमाल किया जा सकता है. क्रम से लगाए गए नतीजे को तय की गई संख्या या कुंजियों या वैल्यू की रेंज के हिसाब से भी फ़िल्टर किया जा सकता है.
डेटा को क्रम से लगाएं
नतीजों का क्रम तय करने के लिए, क्रम से लगाए गए डेटा में से किसी एक को चुनकर शुरुआत करें:
तरीका | इस्तेमाल किए जाने से जुड़ी जानकारी |
---|---|
queryOrderedByKey
| चाइल्ड कुंजियों के हिसाब से नतीजों को क्रम से लगाएं. |
queryOrderedByValue |
चाइल्ड वैल्यू के हिसाब से नतीजों को क्रम से लगाएं. |
queryOrderedByChild |
किसी खास चाइल्ड कुंजी या नेस्ट किए गए चाइल्ड पाथ की वैल्यू के हिसाब से नतीजों को क्रम से लगाएं. |
ऑर्डर करने के लिए, एक बार में सिर्फ़ एक तरीका इस्तेमाल किया जा सकता है. एक ही क्वेरी में, ऑर्डर के क्रम को कई बार कॉल करने से गड़बड़ी होती है.
यह उदाहरण दिखाता है कि आप उपयोगकर्ता की स्टार संख्या के हिसाब से क्रम में लगाई गई उनकी सबसे लोकप्रिय पोस्ट की सूची कैसे वापस ला सकते हैं:
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"];
अन्य डेटा टाइप को क्रम में लगाने के तरीके के बारे में ज़्यादा जानने के लिए, क्वेरी डेटा को क्रम में लगाने का तरीका देखें.
डेटा फ़िल्टर करना
डेटा फ़िल्टर करने के लिए, क्वेरी बनाते समय किसी भी सीमा या रेंज वाले तरीके को क्रम के हिसाब से तरीके से जोड़ा जा सकता है.
तरीका | इस्तेमाल किए जाने से जुड़ी जानकारी |
---|---|
queryLimitedToFirst |
यह आइटम, नतीजों के क्रम वाली सूची की शुरुआत से लौटाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या सेट करता है. |
queryLimitedToLast |
यह विकल्प, नतीजों की क्रम वाली सूची के आखिर से लौटाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या को सेट करता है. |
queryStartingAtValue |
चुने गए ऑर्डर के हिसाब से, बताई गई कुंजी या वैल्यू से ज़्यादा या उसके बराबर के आइटम दिखाएं. |
queryStartingAfterValue |
वे आइटम दिखाएं जो बताए गए कुंजी या वैल्यू से ज़्यादा हों. यह चुने गए क्रम के हिसाब से तय होता है. |
queryEndingAtValue |
चुने गए ऑर्डर के हिसाब से, बताई गई कुंजी या वैल्यू से कम या उसके बराबर के आइटम दिखाएं. |
queryEndingBeforeValue |
वे आइटम दिखाएं जो बताए गए बटन या वैल्यू से कम हों. यह चुने गए ऑर्डर के हिसाब से तरीके के हिसाब से तय होता है. |
queryEqualToValue |
चुने गए ऑर्डर के हिसाब से, चुने गए तरीके के हिसाब से, बताई गई कुंजी या वैल्यू के बराबर की वैल्यू वाले आइटम दिखाएं. |
क्रम के हिसाब से क्रम में लगाने वाले तरीकों के उलट, एक से ज़्यादा सीमा या रेंज फ़ंक्शन को जोड़ा जा सकता है.
उदाहरण के लिए, queryStartingAtValue
और queryEndingAtValue
तरीकों को मिलाकर, वैल्यू की तय की गई रेंज के नतीजों को सीमित किया जा सकता है.
नतीजों की संख्या को सीमित करें
किसी दिए गए कॉलबैक में, बच्चों को ज़्यादा से ज़्यादा संख्या में सिंक करने के लिए, queryLimitedToFirst
और queryLimitedToLast
तरीकों का इस्तेमाल किया जा सकता है. उदाहरण के लिए, अगर 100 की सीमा सेट करने के लिए queryLimitedToFirst
का इस्तेमाल किया जाता है, तो शुरुआत में आपको ज़्यादा से ज़्यादा 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
को कॉल करने से, उसके चाइल्ड नोड पर रजिस्टर किए गए लिसनर अपने-आप नहीं हटते. उन्हें हटाने के लिए आपको उन रेफ़रंस या हैंडल को भी ट्रैक करना होगा.