Apple प्लैटफ़ॉर्म पर डेटा की सूचियों की मदद से काम करना

FIRDatabaseReference पाएं

डेटाबेस से डेटा पढ़ने या उसमें बदलाव करने के लिए, आपके पास FIRDatabaseReference का एक इंस्टेंस होना चाहिए:

Swift

ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
var ref: DatabaseReference!

ref = Database.database().reference()

Objective-C

ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
@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

ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
// 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

ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
// 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

ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

Objective-C

ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
[_commentsRef
              observeEventType:FIRDataEventTypeValue
              withBlock:^(FIRDataSnapshot *snapshot) {
                // Loop over children
                NSEnumerator *children = [snapshot children];
                FIRDataSnapshot *child;
                while (child = [children nextObject]) {
                  // ...
                }
              }];

यह पैटर्न तब काम का हो सकता है, जब आपको एक ही कार्रवाई में सूची के सभी चाइल्ड एंट्री को फ़ेच करना हो. इससे, बच्चे के जोड़े गए अन्य इवेंट को सुनने के बजाय, उन्हें फ़ेच किया जा सकता है.

डेटा को क्रम से लगाना और फ़िल्टर करना

कुंजी, वैल्यू या बच्चे की वैल्यू के हिसाब से क्रम में लगाए गए डेटा को वापस पाने के लिए, रीयलटाइम डेटाबेस FIRDatabaseQuery क्लास का इस्तेमाल किया जा सकता है. क्रम से लगाए गए नतीजे को तय की गई संख्या या कुंजियों या वैल्यू की रेंज के हिसाब से भी फ़िल्टर किया जा सकता है.

डेटा को क्रम से लगाएं

नतीजों का क्रम तय करने के लिए, क्रम से लगाए गए डेटा में से किसी एक को चुनकर शुरुआत करें:

तरीका इस्तेमाल किए जाने से जुड़ी जानकारी
queryOrderedByKey चाइल्ड कुंजियों के हिसाब से नतीजों को क्रम से लगाएं.
queryOrderedByValue चाइल्ड वैल्यू के हिसाब से नतीजों को क्रम से लगाएं.
queryOrderedByChild किसी खास चाइल्ड कुंजी या नेस्ट किए गए चाइल्ड पाथ की वैल्यू के हिसाब से नतीजों को क्रम से लगाएं.

ऑर्डर करने के लिए, एक बार में सिर्फ़ एक तरीका इस्तेमाल किया जा सकता है. एक ही क्वेरी में, ऑर्डर के क्रम को कई बार कॉल करने से गड़बड़ी होती है.

यह उदाहरण दिखाता है कि आप उपयोगकर्ता की स्टार संख्या के हिसाब से क्रम में लगाई गई उनकी सबसे लोकप्रिय पोस्ट की सूची कैसे वापस ला सकते हैं:

Swift

ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
// My top posts by number of stars
let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")

Objective-C

ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
// 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

ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
 
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")

Objective-C

ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
 
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

ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
// 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

ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
// 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 का इस्तेमाल करने पर, डेटा को कुंजी के हिसाब से बढ़ते क्रम में दिखाया जाता है.

  1. जिन बच्चों के पास कुंजी होती है उन्हें 32-बिट वाले पूर्णांक के तौर पर पार्स किया जा सकता है उन्हें बढ़ते क्रम में क्रम में लगाया जाता है.
  2. जिन बच्चों में स्ट्रिंग वैल्यू के आगे मुख्य होता है उन्हें बढ़ते क्रम में लेक्सिकोग्राफ़ी के हिसाब से क्रम में लगाया जाता है.

queryOrderedByValue

queryOrderedByValue का इस्तेमाल करते समय, बच्चों को उनकी वैल्यू के हिसाब से क्रम में लगाया जाता है. ऑर्डर की शर्त वही होती है जो queryOrderedByChild में होती है. हालांकि, नोड की वैल्यू का इस्तेमाल तय चाइल्ड कुंजी की वैल्यू के बजाय किया जाता है.

queryOrderedByChild

queryOrderedByChild का इस्तेमाल करते समय, जिस डेटा में चाइल्ड पासकोड शामिल होता है उसे इस तरह से क्रम में लगाया जाता है:

  1. तय की गई चाइल्ड कुंजी के लिए nil वैल्यू वाले बच्चे पहले आते हैं.
  2. तय की गई चाइल्ड कुंजी के लिए false मान वाले बच्चों के आगे आएं. अगर एक से ज़्यादा बच्चों के लिए false वैल्यू है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़ी के हिसाब से क्रम में लगाया जाता है.
  3. तय की गई चाइल्ड कुंजी के लिए true मान वाले बच्चों के आगे आएं. अगर एक से ज़्यादा बच्चों की वैल्यू true है, तो उन्हें कुंजी के हिसाब से लेसिकोलॉजिकल तरीके से क्रम में लगाया जाता है.
  4. अंकों वाली वैल्यू वाले बच्चे आगे बढ़ते हैं. इन्हें बढ़ते क्रम में लगाया जाता है. अगर बताए गए चाइल्ड नोड के लिए कई चाइल्ड एंट्री की संख्या एक जैसी है, तो उन्हें कुंजी के हिसाब से क्रम में लगाया जाता है.
  5. स्ट्रिंग, संख्याओं के बाद आती हैं. इन्हें बढ़ते हुए क्रम में, कोशिकीय तरीके से क्रम में लगाया जाता है. अगर बताए गए चाइल्ड नोड के लिए कई चाइल्ड नोड की वैल्यू एक जैसी होती है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक तौर पर क्रम में लगाया जाता है.
  6. ऑब्जेक्ट आखिरी में आते हैं और उन्हें बढ़ते क्रम में कुंजी के हिसाब से लेक्सिकोग्राफ़िक तरीके से क्रम में लगाया जाता है.

लिसनर को अलग करें

ViewController को छोड़ने पर, ऑब्ज़र्वर अपने-आप डेटा सिंक करना बंद नहीं करते. अगर ऑब्ज़र्वर को ठीक से नहीं हटाया गया, तो यह डेटा को लोकल मेमोरी में सिंक करता रहेगा. साथ ही, यह इवेंट हैंडलर के बंद होने में कैप्चर किए गए सभी ऑब्जेक्ट को बनाए रखेगा. इससे मेमोरी लीक हो सकती है. जब किसी ऑब्ज़र्वर की ज़रूरत न हो, तो उसे हटाने के लिए, उससे जुड़े FIRDatabaseHandle को removeObserverWithHandle तरीके से पास करें.

किसी पहचान फ़ाइल में कॉलबैक ब्लॉक जोड़ने पर, FIRDatabaseHandle दिखता है. इन हैंडल का इस्तेमाल कॉलबैक ब्लॉक को हटाने के लिए किया जा सकता है.

अगर किसी डेटाबेस रेफ़रंस में एक से ज़्यादा लिसनर जोड़े गए हैं, तो किसी इवेंट के शुरू होने पर हर लिसनर को कॉल किया जाता है. उस जगह पर डेटा को सिंक होने से रोकने के लिए, आपको उस जगह पर मौजूद सभी ऑब्ज़र्वर को हटाना होगा. इसके लिए, आपको removeAllObservers तरीके का इस्तेमाल करना होगा.

लिसनर पर removeObserverWithHandle या removeAllObservers को कॉल करने से, उसके चाइल्ड नोड पर रजिस्टर किए गए लिसनर अपने-आप नहीं हटते. उन्हें हटाने के लिए आपको उन रेफ़रंस या हैंडल को भी ट्रैक करना होगा.

अगले चरण