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

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 उपयोग करते समय, डेटा कुंजी द्वारा आरोही क्रम में लौटाया जाता है।

  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 कॉल करने से उसके चाइल्ड नोड्स पर पंजीकृत श्रोता स्वचालित रूप से नहीं हटते हैं; आपको उन संदर्भों या हैंडलों को हटाने के लिए उन पर भी नज़र रखनी होगी।

अगले कदम