FIRDatabaseReference प्राप्त करें
डेटाबेस से डेटा पढ़ने या लिखने के लिए, आपको FIRDatabaseReference
का एक उदाहरण चाहिए:
तीव्र
var ref: DatabaseReference! ref = Database.database().reference()
उद्देश्य सी
@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
सूचियाँ पढ़ना और लिखना
डेटा की सूची में जोड़ें
बहुउपयोगकर्ता अनुप्रयोगों में किसी सूची में डेटा जोड़ने के लिए childByAutoId
विधि का उपयोग करें। जब भी कोई नया बच्चा निर्दिष्ट फायरबेस संदर्भ में जोड़ा जाता है तो childByAutoId
विधि एक अद्वितीय कुंजी उत्पन्न करती है। सूची में प्रत्येक नए तत्व के लिए इन ऑटो-जेनरेट की गई कुंजियों का उपयोग करके, कई ग्राहक बिना लेखन विरोध के एक ही समय में बच्चों को एक ही स्थान पर जोड़ सकते हैं। childByAutoId
द्वारा उत्पन्न अद्वितीय कुंजी टाइमस्टैम्प पर आधारित होती है, इसलिए सूची आइटम स्वचालित रूप से कालानुक्रमिक रूप से क्रमबद्ध होते हैं।
आप बच्चे की स्वत: जेनरेट की गई कुंजी का मूल्य प्राप्त करने या बच्चे के लिए सेट डेटा प्राप्त करने के लिए childByAutoId
विधि द्वारा लौटाए गए नए डेटा के संदर्भ का उपयोग कर सकते हैं। childByAutoId
संदर्भ पर getKey
कॉल करने से स्वतः-जनरेट की गई कुंजी वापस आ जाती है।
आप अपनी डेटा संरचना को सरल बनाने के लिए इन स्वतः-जनित कुंजियों का उपयोग कर सकते हैं। अधिक जानकारी के लिए डेटा फैन-आउट उदाहरण देखें।
बच्चों की घटनाओं को सुनें
किसी ऑपरेशन से नोड के बच्चों के साथ होने वाले विशिष्ट ऑपरेशनों के जवाब में चाइल्ड इवेंट ट्रिगर होते हैं जैसे कि childByAutoId
विधि के माध्यम से जोड़ा गया एक नया बच्चा या updateChildValues
विधि के माध्यम से अपडेट किया जा रहा बच्चा।
घटना प्रकार | विशिष्ट उपयोग |
---|---|
FIRDataEventTypeChildAdded | आइटमों की सूचियाँ पुनः प्राप्त करें या आइटमों की सूची में अतिरिक्त चीज़ों को सुनें। यह ईवेंट प्रत्येक मौजूदा बच्चे के लिए एक बार ट्रिगर होता है और फिर हर बार निर्दिष्ट पथ में एक नया बच्चा जोड़ा जाता है। श्रोता को एक स्नैपशॉट दिया जाता है जिसमें नए बच्चे का डेटा होता है। |
FIRDataEventTypeChildChanged | किसी सूची में आइटमों में परिवर्तन सुनें. जब भी चाइल्ड नोड को संशोधित किया जाता है तो यह ईवेंट ट्रिगर हो जाता है। इसमें चाइल्ड नोड के वंशजों में कोई भी संशोधन शामिल है। इवेंट श्रोता को दिए गए स्नैपशॉट में बच्चे के लिए अद्यतन डेटा होता है। |
FIRDataEventTypeChildRemoved | सूची से हटाए जा रहे आइटमों को सुनें। यह ईवेंट तब ट्रिगर होता है जब तत्काल बच्चे को हटा दिया जाता है। कॉलबैक ब्लॉक को दिए गए स्नैपशॉट में हटाए गए बच्चे के लिए डेटा होता है। |
FIRDataEventTypeChildMoved | ऑर्डर की गई सूची में आइटमों के क्रम में बदलावों को सुनें। जब भी कोई अपडेट बच्चे को पुनः व्यवस्थित करने का कारण बनता है तो यह ईवेंट ट्रिगर हो जाता है। इसका उपयोग queryOrderedByChild या queryOrderedByValue द्वारा ऑर्डर किए गए डेटा के साथ किया जाता है। |
इनमें से प्रत्येक एक साथ डेटाबेस में किसी विशिष्ट नोड में परिवर्तन सुनने के लिए उपयोगी हो सकता है। उदाहरण के लिए, एक सोशल ब्लॉगिंग ऐप किसी पोस्ट की टिप्पणियों में गतिविधि पर नज़र रखने के लिए इन तरीकों का एक साथ उपयोग कर सकता है, जैसा कि नीचे दिखाया गया है:
तीव्र
// 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 ) })
उद्देश्य सी
// 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
पर्यवेक्षक संलग्न करने से डेटा की पूरी सूची एक डेटास्नैपशॉट के रूप में वापस आ जाएगी, जिसे आप अलग-अलग बच्चों तक पहुंचने के लिए लूप कर सकते हैं।
यहां तक कि जब क्वेरी के लिए केवल एक ही मिलान होता है, तब भी स्नैपशॉट एक सूची है; इसमें केवल एक आइटम शामिल है। आइटम तक पहुंचने के लिए, आपको परिणाम पर लूप करना होगा:
तीव्र
_commentsRef.observe(.value) { snapshot in for child in snapshot.children { ... } }
उद्देश्य सी
[_commentsRef observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { // Loop over children NSEnumerator *children = [snapshot children]; FIRDataSnapshot *child; while (child = [children nextObject]) { // ... } }];
यह पैटर्न तब उपयोगी हो सकता है जब आप अतिरिक्त बच्चों द्वारा जोड़े गए ईवेंट को सुनने के बजाय किसी सूची के सभी बच्चों को एक ही ऑपरेशन में लाना चाहते हैं।
डेटा को सॉर्ट करना और फ़िल्टर करना
आप कुंजी, मूल्य या किसी बच्चे के मूल्य के आधार पर क्रमबद्ध डेटा को पुनः प्राप्त करने के लिए रीयलटाइम डेटाबेस FIRDatabaseQuery
क्लास का उपयोग कर सकते हैं। आप क्रमबद्ध परिणाम को विशिष्ट संख्या में परिणामों या कुंजियों या मानों की श्रेणी में फ़िल्टर भी कर सकते हैं।
डेटा क्रमबद्ध करें
क्रमबद्ध डेटा को पुनः प्राप्त करने के लिए, परिणामों को कैसे क्रमबद्ध किया जाता है यह निर्धारित करने के लिए ऑर्डर-बाय विधियों में से एक को निर्दिष्ट करके प्रारंभ करें:
तरीका | प्रयोग |
---|---|
queryOrderedByKey | चाइल्ड कुंजी द्वारा परिणाम ऑर्डर करें। |
queryOrderedByValue | बच्चों के मूल्यों के आधार पर परिणाम क्रमबद्ध करें। |
queryOrderedByChild | किसी निर्दिष्ट चाइल्ड कुंजी या नेस्टेड चाइल्ड पथ के मान के आधार पर परिणामों को क्रमित करें। |
आप एक समय में केवल एक ऑर्डर-बाय विधि का उपयोग कर सकते हैं। एक ही क्वेरी में ऑर्डर-बाय विधि को कई बार कॉल करने से त्रुटि उत्पन्न होती है।
निम्नलिखित उदाहरण दर्शाता है कि आप किसी उपयोगकर्ता की स्टार संख्या के आधार पर क्रमबद्ध शीर्ष पोस्ट की सूची कैसे प्राप्त कर सकते हैं:
तीव्र
// My top posts by number of stars let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")
उद्देश्य सी
// 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", } },
इस मामले में, हम अपनी queryOrderedByChild
कॉल में नेस्टेड चाइल्ड के सापेक्ष पथ को निर्दिष्ट करके metrics
कुंजी के तहत नेस्टेड मानों के आधार पर अपने सूची तत्वों को ऑर्डर कर सकते हैं।
तीव्र
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")
उद्देश्य सी
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];
अन्य डेटा प्रकारों को कैसे ऑर्डर किया जाता है, इस बारे में अधिक जानकारी के लिए, क्वेरी डेटा को कैसे ऑर्डर किया जाता है देखें।
डेटा फ़िल्टर करना
डेटा फ़िल्टर करने के लिए, आप क्वेरी बनाते समय किसी भी सीमा या श्रेणी विधि को ऑर्डर-बाय विधि के साथ जोड़ सकते हैं।
तरीका | प्रयोग |
---|---|
queryLimitedToFirst | परिणामों की क्रमबद्ध सूची की शुरुआत से लौटने के लिए आइटमों की अधिकतम संख्या निर्धारित करता है। |
queryLimitedToLast | परिणामों की आदेशित सूची के अंत से लौटाए जाने वाले आइटमों की अधिकतम संख्या निर्धारित करता है। |
queryStartingAtValue | चुनी गई ऑर्डर-बाय विधि के आधार पर, निर्दिष्ट कुंजी या मान से अधिक या उसके बराबर आइटम लौटाएं। |
queryStartingAfterValue | चुनी गई ऑर्डर-बाय विधि के आधार पर, निर्दिष्ट कुंजी या मान से अधिक आइटम लौटाएं। |
queryEndingAtValue | चुनी गई ऑर्डर-बाय विधि के आधार पर, निर्दिष्ट कुंजी या मान से कम या उसके बराबर आइटम लौटाएं। |
queryEndingBeforeValue | चुनी गई ऑर्डर-बाय विधि के आधार पर, निर्दिष्ट कुंजी या मान से कम आइटम लौटाएं। |
queryEqualToValue | चुनी गई ऑर्डर-बाय विधि के आधार पर, निर्दिष्ट कुंजी या मान के बराबर आइटम लौटाएं। |
ऑर्डर-बाय विधियों के विपरीत, आप एकाधिक सीमा या श्रेणी फ़ंक्शंस को जोड़ सकते हैं। उदाहरण के लिए, आप परिणामों को मानों की एक निर्दिष्ट सीमा तक सीमित करने के लिए queryStartingAtValue
और queryEndingAtValue
विधियों को जोड़ सकते हैं।
परिणामों की संख्या सीमित करें
किसी दिए गए कॉलबैक के लिए सिंक किए जाने वाले बच्चों की अधिकतम संख्या निर्धारित करने के लिए आप queryLimitedToFirst
और queryLimitedToLast
तरीकों का उपयोग कर सकते हैं। उदाहरण के लिए, यदि आप 100 की सीमा निर्धारित करने के लिए queryLimitedToFirst
उपयोग करते हैं, तो आपको प्रारंभ में केवल 100 FIRDataEventTypeChildAdded
कॉलबैक प्राप्त होते हैं। यदि आपके फायरबेस डेटाबेस में 100 से कम आइटम संग्रहीत हैं, तो प्रत्येक आइटम के लिए एक FIRDataEventTypeChildAdded
कॉलबैक सक्रिय होता है।
जैसे ही आइटम बदलते हैं, आपको क्वेरी दर्ज करने वाले आइटम के लिए FIRDataEventTypeChildAdded
कॉलबैक प्राप्त होते हैं और इससे बाहर निकलने वाले आइटम के लिए FIRDataEventTypeChildRemoved
कॉलबैक प्राप्त होते हैं ताकि कुल संख्या 100 पर बनी रहे।
निम्नलिखित उदाहरण दर्शाता है कि कैसे एक उदाहरण ब्लॉगिंग ऐप सभी उपयोगकर्ताओं द्वारा 100 सबसे हालिया पोस्ट की सूची पुनर्प्राप्त कर सकता है:
तीव्र
// Last 100 posts, these are automatically the 100 most recent // due to sorting by push() keys let recentPostsQuery = (ref?.child("posts").queryLimited(toFirst: 100))!
उद्देश्य सी
// 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
कॉल करने से उसके चाइल्ड नोड्स पर पंजीकृत श्रोता स्वचालित रूप से नहीं हटते हैं; आपको उन संदर्भों या हैंडलों को हटाने के लिए उन पर भी नज़र रखनी होगी।