क्लाउड फायरस्टोर आईओएस कोडलैब

1 अवलोकन

लक्ष्य

इस कोडलैब में आप स्विफ्ट में आईओएस पर फायरस्टोर-समर्थित रेस्तरां अनुशंसा ऐप का निर्माण करेंगे। आप जान जायेंगे कैसे:

  1. आईओएस ऐप से फायरस्टोर को डेटा पढ़ें और लिखें
  2. रीयलटाइम में Firestore डेटा में बदलाव सुनें
  3. Firestore डेटा सुरक्षित करने के लिए Firebase प्रमाणीकरण और सुरक्षा नियमों का उपयोग करें
  4. जटिल फायरस्टोर प्रश्न लिखें

आवश्यक शर्तें

इस कोडलैब को शुरू करने से पहले सुनिश्चित करें कि आपने इंस्टॉल किया है:

  • एक्सकोड संस्करण 8.3 (या उच्चतर)
  • CocoaPods 1.2.1 (या उच्चतर)

2. फायरबेस कंसोल प्रोजेक्ट बनाएं

प्रोजेक्ट में Firebase जोड़ें

  1. पर जाएं Firebase कंसोल
  2. नया प्रोजेक्ट बनाएँ और अपने परियोजना "इस firestore आईओएस Codelab" नाम का चयन करें।

3. नमूना परियोजना प्राप्त करें

कोड डाउनलोड करें

क्लोनिंग से शुरू नमूना परियोजना है और चल रहा pod update परियोजना निर्देशिका में:

git clone https://github.com/firebase/friendlyeats-ios
cd friendlyeats-ios
pod update

ओपन FriendlyEats.xcworkspace Xcode में और इसे चलाने के (Cmd + R)। एप्लिकेशन को सही ढंग से संकलन करना चाहिए और तुरंत, लांच पर दुर्घटना के बाद से यह एक कमी है GoogleService-Info.plist फ़ाइल। हम इसे अगले चरण में ठीक कर देंगे।

फायरबेस सेट करें

का पालन करें प्रलेखन एक नया firestore का प्रोजेक्ट बनाने के लिए। एक बार जब आप अपनी परियोजना मिल गया है, अपनी परियोजना के डाउनलोड GoogleService-Info.plist से फ़ाइल Firebase सांत्वना Xcode प्रोजेक्ट की जड़ है और इसे खींचें। यह सुनिश्चित करने के लिए प्रोजेक्ट को फिर से चलाएं कि ऐप सही तरीके से कॉन्फ़िगर हो और लॉन्च पर क्रैश न हो। लॉग इन करने के बाद, आपको नीचे दिए गए उदाहरण की तरह एक खाली स्क्रीन दिखाई देनी चाहिए। यदि आप लॉग इन करने में असमर्थ हैं, तो सुनिश्चित करें कि आपने प्रमाणीकरण के तहत फायरबेस कंसोल में ईमेल/पासवर्ड साइन-इन विधि सक्षम की है।

10a0671ce8f99704.png

4. फायरस्टोर को डेटा लिखें

इस खंड में हम फायरस्टोर को कुछ डेटा लिखेंगे ताकि हम ऐप यूआई को पॉप्युलेट कर सकें। इस के माध्यम से मैन्युअल रूप से किया जा सकता है Firebase कंसोल , लेकिन हम एप्लिकेशन को स्वयं एक बुनियादी Firestore लिखने का प्रदर्शन करने में कर देंगे।

हमारे ऐप में मुख्य मॉडल ऑब्जेक्ट एक रेस्तरां है। फायरस्टोर डेटा को दस्तावेज़ों, संग्रहों और उप-संग्रहों में विभाजित किया गया है। हम एक उच्च-स्तरीय संग्रह कहा जाता है में एक दस्तावेज़ के रूप में प्रत्येक रेस्तरां स्टोर करेगा restaurants । आप इस firestore डेटा मॉडल के बारे में अधिक जानने के लिए चाहते हैं, तो दस्तावेज़ और में संग्रह के बारे में पढ़ा प्रलेखन

इससे पहले कि हम फायरस्टोर में डेटा जोड़ सकें, हमें रेस्तरां संग्रह का संदर्भ प्राप्त करने की आवश्यकता है। में पाश के लिए आंतरिक के लिए निम्न जोड़े RestaurantsTableViewController.didTapPopulateButton(_:) विधि।

let collection = Firestore.firestore().collection("restaurants")

अब जब हमारे पास एक संग्रह संदर्भ है तो हम कुछ डेटा लिख ​​सकते हैं। हमारे द्वारा जोड़े गए कोड की अंतिम पंक्ति के ठीक बाद निम्नलिखित जोड़ें:

let collection = Firestore.firestore().collection("restaurants")

// ====== ADD THIS ======
let restaurant = Restaurant(
  name: name,
  category: category,
  city: city,
  price: price,
  ratingCount: 0,
  averageRating: 0
)

collection.addDocument(data: restaurant.dictionary)

उपरोक्त कोड रेस्तरां संग्रह में एक नया दस्तावेज़ जोड़ता है। दस्तावेज़ डेटा एक शब्दकोश से आता है, जो हमें एक रेस्तरां संरचना से मिलता है।

हम लगभग वहां हैं- इससे पहले कि हम फायरस्टोर को दस्तावेज लिख सकें, हमें फायरस्टोर के सुरक्षा नियमों को खोलना होगा और यह वर्णन करना होगा कि हमारे डेटाबेस के कौन से हिस्से कौन से उपयोगकर्ताओं द्वारा लिखने योग्य होने चाहिए। अभी के लिए, हम केवल प्रमाणित उपयोगकर्ताओं को ही संपूर्ण डेटाबेस को पढ़ने और लिखने की अनुमति देंगे। यह एक प्रोडक्शन ऐप के लिए थोड़ा बहुत अनुमेय है, लेकिन ऐप-बिल्डिंग प्रक्रिया के दौरान हम कुछ आराम चाहते हैं, इसलिए हम प्रयोग करते समय प्रमाणीकरण के मुद्दों में लगातार नहीं चलेंगे। इस कोडलैब के अंत में हम बात करेंगे कि कैसे अपने सुरक्षा नियमों को सख्त किया जाए और अनजाने में पढ़ने और लिखने की संभावना को सीमित किया जाए।

में नियम टैब Firebase कंसोल के निम्नलिखित नियम जोड़ने और फिर प्रकाशित करें क्लिक करें।

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      //
      // WARNING: These rules are insecure! We will replace them with
      // more secure rules later in the codelab
      //
      allow read, write: if request.auth != null;
    }
  }
}

हम विस्तार से सुरक्षा नियमों बाद में चर्चा करेंगे, लेकिन अगर आप जल्दी में हैं, पर एक नज़र डालें सुरक्षा नियमों प्रलेखन

में एप्लिकेशन और संकेत चलाएँ। फिर ऊपरी बाएँ है, जो रेस्तरां दस्तावेजों की एक बैच बनाएगा में "आबाद" बटन टैप करें, भले ही आप अभी तक अनुप्रयोग में इसे नहीं देख सकेंगे।

इसके बाद, करने के लिए नेविगेट इस firestore डेटा टैब Firebase कंसोल में। अब आपको रेस्तरां संग्रह में नई प्रविष्टियाँ देखनी चाहिए:

स्क्रीन शॉट 2017-07-06 अपराह्न 12.45.38 बजे.png

बधाई हो, आपने अभी-अभी एक iOS ऐप से Firestore को डेटा लिखा है! अगले भाग में आप सीखेंगे कि फायरस्टोर से डेटा कैसे प्राप्त करें और इसे ऐप में प्रदर्शित करें।

5. फायरस्टोर से डेटा प्रदर्शित करें

इस खंड में आप सीखेंगे कि फायरस्टोर से डेटा कैसे प्राप्त करें और इसे ऐप में प्रदर्शित करें। दो प्रमुख चरण एक क्वेरी बना रहे हैं और एक स्नैपशॉट श्रोता जोड़ रहे हैं। इस श्रोता को सभी मौजूदा डेटा के बारे में सूचित किया जाएगा जो क्वेरी से मेल खाता है और वास्तविक समय में अपडेट प्राप्त करता है।

सबसे पहले, आइए उस क्वेरी का निर्माण करें जो रेस्तरां की डिफ़ॉल्ट, अनफ़िल्टर्ड सूची की सेवा करेगी। के कार्यान्वयन पर एक नजर डालें RestaurantsTableViewController.baseQuery() :

return Firestore.firestore().collection("restaurants").limit(to: 50)

यह क्वेरी "रेस्तरां" नामक शीर्ष-स्तरीय संग्रह के 50 रेस्तरां तक ​​पुनर्प्राप्त करती है। अब जब हमारे पास एक प्रश्न है, तो हमें अपने ऐप में फायरस्टोर से डेटा लोड करने के लिए एक स्नैपशॉट श्रोता संलग्न करना होगा। निम्न कोड जोड़ें RestaurantsTableViewController.observeQuery() बस के लिए कॉल के बाद विधि stopObserving()

listener = query.addSnapshotListener { [unowned self] (snapshot, error) in
  guard let snapshot = snapshot else {
    print("Error fetching snapshot results: \(error!)")
    return
  }
  let models = snapshot.documents.map { (document) -> Restaurant in
    if let model = Restaurant(dictionary: document.data()) {
      return model
    } else {
      // Don't use fatalError here in a real app.
      fatalError("Unable to initialize type \(Restaurant.self) with dictionary \(document.data())")
    }
  }
  self.restaurants = models
  self.documents = snapshot.documents

  if self.documents.count > 0 {
    self.tableView.backgroundView = nil
  } else {
    self.tableView.backgroundView = self.backgroundView
  }

  self.tableView.reloadData()
}

उपरोक्त कोड फायरस्टोर से संग्रह डाउनलोड करता है और इसे स्थानीय रूप से एक सरणी में संग्रहीत करता है। addSnapshotListener(_:) कॉल एक स्नैपशॉट श्रोता क्वेरी उस दृश्य नियंत्रक हर बार डेटा सर्वर पर बदल जाता है अद्यतन करेगा करने के लिए कहते हैं। हमें स्वचालित रूप से अपडेट मिलते हैं और परिवर्तनों को मैन्युअल रूप से पुश करने की आवश्यकता नहीं होती है। याद रखें, सर्वर-साइड परिवर्तन के परिणामस्वरूप इस स्नैपशॉट श्रोता को किसी भी समय बुलाया जा सकता है, इसलिए यह महत्वपूर्ण है कि हमारा ऐप परिवर्तनों को संभाल सके।

हमारे शब्दकोशों मानचित्रण structs (देखने के लिए बाद Restaurant.swift ), डेटा प्रदर्शित करने में कुछ दृश्य गुण बताए का सिर्फ एक मामला है। में निम्नलिखित पंक्तियां जोड़ें RestaurantTableViewCell.populate(restaurant:) में RestaurantsTableViewController.swift

nameLabel.text = restaurant.name
cityLabel.text = restaurant.city
categoryLabel.text = restaurant.category
starsView.rating = Int(restaurant.averageRating.rounded())
priceLabel.text = priceString(from: restaurant.price)

यह पॉप्युलेट विधि तालिका दृश्य डेटा स्रोत से कहा जाता है tableView(_:cellForRowAtIndexPath:) व्यक्ति तालिका दृश्य कोशिकाओं को पहले विधि है, जिसमें से मूल्य प्रकार के संग्रह मानचित्रण का ख्याल रखता है।

ऐप को फिर से चलाएं और सत्यापित करें कि जिन रेस्तरां को हमने पहले कंसोल में देखा था, वे अब सिम्युलेटर या डिवाइस पर दिखाई दे रहे हैं। यदि आपने इस अनुभाग को सफलतापूर्वक पूरा कर लिया है तो आपका ऐप अब क्लाउड फायरस्टोर के साथ डेटा पढ़ और लिख रहा है!

2ca7f8c6052f7f79.png

6. डेटा सॉर्ट करना और फ़िल्टर करना

वर्तमान में हमारा ऐप रेस्तरां की एक सूची प्रदर्शित करता है, लेकिन उपयोगकर्ता के पास उनकी आवश्यकताओं के आधार पर फ़िल्टर करने का कोई तरीका नहीं है। इस खंड में आप फ़िल्टरिंग को सक्षम करने के लिए फायरस्टोर की उन्नत क्वेरी का उपयोग करेंगे।

यहां सभी डिम सम रेस्तरां लाने के लिए एक साधारण क्वेरी का उदाहरण दिया गया है:

let filteredQuery = query.whereField("category", isEqualTo: "Dim Sum")

जैसा कि इसके नाम से स्पष्ट है, whereField(_:isEqualTo:) विधि हमारे क्वेरी डाउनलोड संग्रह जिसका क्षेत्रों प्रतिबंध हम को पूरा के सदस्य ही कर देगा। इस मामले में, यह केवल रेस्तरां जहां डाउनलोड करेंगे category है "Dim Sum"

इस ऐप में उपयोगकर्ता विशिष्ट क्वेरी बनाने के लिए कई फ़िल्टरों को श्रृंखलाबद्ध कर सकता है, जैसे "सैन फ्रांसिस्को में पिज्जा" या "लॉस एंजिल्स में समुद्री भोजन लोकप्रियता द्वारा आदेशित"।

ओपन RestaurantsTableViewController.swift और के बीच के लिए निम्न कोड खंड जोड़ें query(withCategory:city:price:sortBy:) :

if let category = category, !category.isEmpty {
  filtered = filtered.whereField("category", isEqualTo: category)
}

if let city = city, !city.isEmpty {
  filtered = filtered.whereField("city", isEqualTo: city)
}

if let price = price {
  filtered = filtered.whereField("price", isEqualTo: price)
}

if let sortBy = sortBy, !sortBy.isEmpty {
  filtered = filtered.order(by: sortBy)
}

स्निपेट के ऊपर कई कहते हैं whereField और order उपयोगकर्ता इनपुट के आधार पर एक भी यौगिक क्वेरी बनाने के लिए खंड। अब हमारी क्वेरी केवल उन रेस्तरां को लौटाएगी जो उपयोगकर्ता की आवश्यकताओं से मेल खाते हैं।

अपना प्रोजेक्ट चलाएं और सत्यापित करें कि आप मूल्य, शहर और श्रेणी के आधार पर फ़िल्टर कर सकते हैं (सुनिश्चित करें कि श्रेणी और शहर के नाम बिल्कुल टाइप करें)। परीक्षण करते समय आपको अपने लॉग में त्रुटियाँ दिखाई दे सकती हैं जो इस तरह दिखती हैं:

Error fetching snapshot results: Error Domain=io.grpc Code=9 
"The query requires an index. You can create it here: https://console.firebase.google.com/project/testapp-5d356/database/firestore/indexes?create_index=..." 
UserInfo={NSLocalizedDescription=The query requires an index. You can create it here: https://console.firebase.google.com/project/project-id/database/firestore/indexes?create_index=...}

ऐसा इसलिए है क्योंकि फायरस्टोर को अधिकांश मिश्रित प्रश्नों के लिए अनुक्रमणिका की आवश्यकता होती है। प्रश्नों पर आवश्यक अनुक्रमणिका फायरस्टोर को तेजी से बड़े पैमाने पर रखती है। त्रुटि संदेश से लिंक खोल स्वचालित रूप से सही रूप से भरा मानकों के साथ Firebase कंसोल में सूचकांक निर्माण UI खुल जाएगा।, इस firestore में अनुक्रमित के बारे में अधिक जानने के लिए प्रलेखन पर जाएँ

7. लेनदेन में डेटा लिखना

इस अनुभाग में, हम उपयोगकर्ताओं के लिए रेस्तरां में समीक्षा सबमिट करने की क्षमता जोड़ देंगे। अब तक, हमारे सभी लेखन परमाणु और अपेक्षाकृत सरल रहे हैं। यदि उनमें से किसी ने त्रुटि की है, तो हम संभवतः उपयोगकर्ता को उन्हें पुनः प्रयास करने या स्वचालित रूप से पुनः प्रयास करने के लिए संकेत देंगे।

एक रेस्तरां में एक रेटिंग जोड़ने के लिए हमें कई पढ़ने और लिखने के समन्वय की आवश्यकता होती है। पहले स्वयं समीक्षा प्रस्तुत करनी होगी, और फिर रेस्तरां की रेटिंग गणना और औसत रेटिंग को अपडेट करना होगा। यदि इनमें से एक विफल हो जाता है, लेकिन दूसरा नहीं, तो हम एक असंगत स्थिति में रह जाते हैं, जहां हमारे डेटाबेस के एक हिस्से का डेटा दूसरे में डेटा से मेल नहीं खाता है।

सौभाग्य से, फायरस्टोर लेनदेन की कार्यक्षमता प्रदान करता है जो हमें एक ही परमाणु संचालन में कई पढ़ने और लिखने देता है, यह सुनिश्चित करता है कि हमारा डेटा सुसंगत बना रहे।

सभी देना घोषणाओं नीचे निम्न कोड जोड़ें RestaurantDetailViewController.reviewController(_:didSubmitFormWithReview:)

let firestore = Firestore.firestore()
firestore.runTransaction({ (transaction, errorPointer) -> Any? in

  // Read data from Firestore inside the transaction, so we don't accidentally
  // update using stale client data. Error if we're unable to read here.
  let restaurantSnapshot: DocumentSnapshot
  do {
    try restaurantSnapshot = transaction.getDocument(reference)
  } catch let error as NSError {
    errorPointer?.pointee = error
    return nil
  }

  // Error if the restaurant data in Firestore has somehow changed or is malformed.
  guard let data = restaurantSnapshot.data(),
        let restaurant = Restaurant(dictionary: data) else {

    let error = NSError(domain: "FireEatsErrorDomain", code: 0, userInfo: [
      NSLocalizedDescriptionKey: "Unable to write to restaurant at Firestore path: \(reference.path)"
    ])
    errorPointer?.pointee = error
    return nil
  }

  // Update the restaurant's rating and rating count and post the new review at the 
  // same time.
  let newAverage = (Float(restaurant.ratingCount) * restaurant.averageRating + Float(review.rating))
      / Float(restaurant.ratingCount + 1)

  transaction.setData(review.dictionary, forDocument: newReviewReference)
  transaction.updateData([
    "numRatings": restaurant.ratingCount + 1,
    "avgRating": newAverage
  ], forDocument: reference)
  return nil
}) { (object, error) in
  if let error = error {
    print(error)
  } else {
    // Pop the review controller on success
    if self.navigationController?.topViewController?.isKind(of: NewReviewViewController.self) ?? false {
      self.navigationController?.popViewController(animated: true)
    }
  }
}

अद्यतन ब्लॉक के अंदर, लेन-देन वस्तु का उपयोग करके हम जो भी संचालन करते हैं, उसे फायरस्टोर द्वारा एकल परमाणु अद्यतन के रूप में माना जाएगा। यदि सर्वर पर अपडेट विफल हो जाता है, तो फायरस्टोर स्वचालित रूप से इसे कुछ बार पुनः प्रयास करेगा। इसका मतलब यह है कि हमारी त्रुटि की स्थिति सबसे अधिक बार-बार होने वाली एक त्रुटि है, उदाहरण के लिए यदि डिवाइस पूरी तरह से ऑफ़लाइन है या उपयोगकर्ता उस पथ पर लिखने के लिए अधिकृत नहीं है जिस पर वे लिखने का प्रयास कर रहे हैं।

8. सुरक्षा नियम

हमारे ऐप के उपयोगकर्ता हमारे डेटाबेस में डेटा के हर टुकड़े को पढ़ने और लिखने में सक्षम नहीं होना चाहिए। उदाहरण के लिए, सभी को एक रेस्तरां की रेटिंग देखने में सक्षम होना चाहिए, लेकिन केवल एक प्रमाणित उपयोगकर्ता को ही रेटिंग पोस्ट करने की अनुमति होनी चाहिए। क्लाइंट पर अच्छा कोड लिखना पर्याप्त नहीं है, हमें पूरी तरह से सुरक्षित होने के लिए बैकएंड पर अपने डेटा सुरक्षा मॉडल को निर्दिष्ट करने की आवश्यकता है। इस खंड में हम सीखेंगे कि अपने डेटा की सुरक्षा के लिए फायरबेस सुरक्षा नियमों का उपयोग कैसे करें।

सबसे पहले, आइए हम कोडलैब की शुरुआत में लिखे गए सुरक्षा नियमों पर गहराई से नज़र डालें। करने के लिए Firebase कंसोल और नेविगेट खोलें डाटाबेस> Firestore टैब में नियम

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      // Only authenticated users can read or write data
      allow read, write: if request.auth != null;
    }
  }
}

request नियमों में चर के ऊपर एक वैश्विक चर सभी नियमों में उपलब्ध है, और सशर्त हम जोड़ा सुनिश्चित है कि अनुरोध उन कुछ भी करने को अनुमति देने से पहले प्रमाणीकृत है। यह अनधिकृत उपयोगकर्ताओं को आपके डेटा में अनधिकृत परिवर्तन करने के लिए Firestore API का उपयोग करने से रोकता है। यह एक अच्छी शुरुआत है, लेकिन हम और अधिक शक्तिशाली चीजें करने के लिए फायरस्टोर नियमों का उपयोग कर सकते हैं।

आइए समीक्षा लिखने को प्रतिबंधित करें ताकि समीक्षा की उपयोगकर्ता आईडी प्रमाणित उपयोगकर्ता की आईडी से मेल खाना चाहिए। यह सुनिश्चित करता है कि उपयोगकर्ता एक-दूसरे का प्रतिरूपण नहीं कर सकते और कपटपूर्ण समीक्षाएँ नहीं छोड़ सकते। अपने सुरक्षा नियमों को निम्नलिखित से बदलें:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /restaurants/{any}/ratings/{rating} {
      // Users can only write ratings with their user ID
      allow read;
      allow write: if request.auth != null 
                   && request.auth.uid == request.resource.data.userId;
    }
  
    match /restaurants/{any} {
      // Only authenticated users can read or write data
      allow read, write: if request.auth != null;
    }
  }
}

पहला मैच बयान subcollection नामित मेल खाता ratings से संबंधित किसी भी दस्तावेज़ के restaurants संग्रह। allow write सशर्त तो प्रस्तुत किया जा रहा है, तो समीक्षा के उपयोगकर्ता आईडी उपयोगकर्ता की कि मेल नहीं खाता से किसी भी समीक्षा को रोकता है। दूसरा मैच स्टेटमेंट किसी भी प्रमाणित उपयोगकर्ता को डेटाबेस में रेस्तरां पढ़ने और लिखने की अनुमति देता है।

यह हमारी समीक्षाओं के लिए वास्तव में अच्छी तरह से काम करता है, क्योंकि हमने सुरक्षा नियमों का उपयोग स्पष्ट रूप से अपने ऐप में पहले लिखी गई अंतर्निहित गारंटी को स्पष्ट रूप से बताने के लिए किया है - कि उपयोगकर्ता केवल अपनी समीक्षाएं लिख सकते हैं। यदि हम समीक्षाओं के लिए एक संपादन या हटाने का कार्य जोड़ते हैं, तो नियमों का यह ठीक वही सेट उपयोगकर्ताओं को अन्य उपयोगकर्ताओं की समीक्षाओं को संशोधित करने या हटाने से भी रोकेगा। लेकिन फायरस्टोर नियमों का उपयोग अधिक बारीक फैशन में भी किया जा सकता है ताकि दस्तावेजों के भीतर अलग-अलग क्षेत्रों पर लिखने को सीमित किया जा सके, न कि पूरे दस्तावेजों को। हम इसका उपयोग उपयोगकर्ताओं को किसी रेस्तरां के लिए केवल रेटिंग, औसत रेटिंग और रेटिंग की संख्या को अपडेट करने की अनुमति देने के लिए कर सकते हैं, जिससे किसी दुर्भावनापूर्ण उपयोगकर्ता द्वारा किसी रेस्तरां के नाम या स्थान को बदलने की संभावना समाप्त हो जाती है।

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /restaurants/{restaurant} {
      match /ratings/{rating} {
        allow read: if request.auth != null;
        allow write: if request.auth != null 
                     && request.auth.uid == request.resource.data.userId;
      }
    
      allow read: if request.auth != null;
      allow create: if request.auth != null;
      allow update: if request.auth != null
                    && request.resource.data.name == resource.data.name
                    && request.resource.data.city == resource.data.city
                    && request.resource.data.price == resource.data.price
                    && request.resource.data.category == resource.data.category;
    }
  }
}

यहां हमने अपनी लेखन अनुमति को बनाने और अपडेट करने में विभाजित किया है ताकि हम इस बारे में अधिक विशिष्ट हो सकें कि किन कार्यों की अनुमति दी जानी चाहिए। कोई भी उपयोगकर्ता डेटाबेस में रेस्तरां लिख सकता है, कोडलैब की शुरुआत में हमारे द्वारा बनाए गए पॉप्युलेट बटन की कार्यक्षमता को संरक्षित करते हुए, लेकिन एक बार रेस्तरां के नाम, स्थान, मूल्य और श्रेणी को लिखे जाने के बाद इसे बदला नहीं जा सकता है। अधिक विशेष रूप से, अंतिम नियम के लिए डेटाबेस में पहले से मौजूद फ़ील्ड के समान नाम, शहर, मूल्य और श्रेणी को बनाए रखने के लिए किसी भी रेस्तरां अपडेट ऑपरेशन की आवश्यकता होती है।

यदि आप सुरक्षा नियमों के साथ क्या कर सकते हैं के बारे में अधिक जानने के लिए, पर एक नज़र डालें प्रलेखन

9. निष्कर्ष

इस कोडलैब में, आपने सीखा कि कैसे फायरस्टोर के साथ बुनियादी और उन्नत पढ़ना और लिखना है, साथ ही सुरक्षा नियमों के साथ डेटा एक्सेस कैसे सुरक्षित करना है। आप पर पूरा समाधान पा सकते हैं codelab-complete शाखा

फायरस्टोर के बारे में अधिक जानने के लिए, निम्नलिखित संसाधनों पर जाएँ: