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

FIRDatabaseReference पाना

डेटाबेस से डेटा पढ़ने या उसमें डेटा लिखने के लिए, आपको FIRDatabaseReference के इंस्टेंस की ज़रूरत होगी:

Swift

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

ref = Database.database().reference()

Objective-C

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

ध्यान दें: Firebase का यह प्रॉडक्ट, ऐप्लिकेशन क्लिप टारगेट पर उपलब्ध नहीं है.
// 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 का यह प्रॉडक्ट, ऐप्लिकेशन क्लिप टारगेट पर उपलब्ध नहीं है.
// 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 का यह प्रॉडक्ट, ऐप्लिकेशन क्लिप टारगेट पर उपलब्ध नहीं है.
_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

Objective-C

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

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

Objective-C

ध्यान दें: Firebase का यह प्रॉडक्ट, ऐप्लिकेशन क्लिप टारगेट पर उपलब्ध नहीं है.
// 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 कुंजी के तहत नेस्ट की गई वैल्यू के हिसाब से, सूची के एलिमेंट को क्रम में लगा सकते हैं.

Swift

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

Objective-C

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

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

  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 को कॉल करने से, उसके चाइल्ड नोड पर रजिस्टर किए गए लिसनर अपने-आप नहीं हटते. उन्हें हटाने के लिए, आपको उन रेफ़रंस या हैंडल को भी ट्रैक करना होगा.

अगले चरण