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 तरीके का इस्तेमाल करें का इस्तेमाल करें. childByAutoId तरीका, हर बार नई कुंजी जनरेट करता है चाइल्ड को तय किए गए Firebase रेफ़रंस में जोड़ दिया जाता है. इनका इस्तेमाल करके सूची के हर एक नए एलिमेंट के लिए अपने-आप जनरेट होने वाली कुंजियां, कई क्लाइंट जोड़ सकते हैं एक ही समय पर बच्चों को एक ही जगह पर ले जाएं. साथ ही, इस पर लिखने में कोई गड़बड़ी न हो. कॉन्टेंट बनाने 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"];

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

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 तरीकों का इस्तेमाल करके किसी दिए गए कॉलबैक के लिए सिंक किए जाने वाले बच्चों की ज़्यादा से ज़्यादा संख्या. उदाहरण के लिए, अगर तो आप queryLimitedToFirst का इस्तेमाल करके 100 की सीमा सेट करते हैं. शुरुआत में 100 FIRDataEventTypeChildAdded कॉलबैक तक. अगर आपने अपने स्टोर में 100 से कम आइटम सेव किए हैं, Firebase डेटाबेस, हर आइटम के लिए 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 को कॉल करने से ऐसा होता है अपने चाइल्ड नोड पर रजिस्टर किए गए लिसनर को अपने-आप नहीं हटाएं; आपको भी ज़रूरी है कि उन रेफ़रंस या हैंडल को हटाने के लिए उनका ट्रैक रखें.

अगले चरण