Apple प्लेटफॉर्म पर डेटा पढ़ें और लिखें

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

(वैकल्पिक) फायरबेस स्थानीय एमुलेटर सूट के साथ प्रोटोटाइप और परीक्षण

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

एक रीयलटाइम डेटाबेस एमुलेटर स्थानीय एमुलेटर सूट का हिस्सा है, जो आपके ऐप को आपकी एमुलेटेड डेटाबेस सामग्री और कॉन्फ़िगरेशन के साथ-साथ वैकल्पिक रूप से आपके नकली प्रोजेक्ट संसाधनों (फ़ंक्शंस, अन्य डेटाबेस और सुरक्षा नियम) के साथ इंटरैक्ट करने में सक्षम बनाता है।

रीयलटाइम डेटाबेस एमुलेटर का उपयोग करने में कुछ ही चरण शामिल हैं:

  1. एमुलेटर से कनेक्ट करने के लिए अपने ऐप के टेस्ट कॉन्फिगर में कोड की एक लाइन जोड़ना।
  2. अपनी स्थानीय परियोजना निर्देशिका की जड़ से, firebase emulators:start
  3. हमेशा की तरह रीयलटाइम डेटाबेस प्लेटफ़ॉर्म SDK का उपयोग करके या रीयलटाइम डेटाबेस REST API का उपयोग करके अपने ऐप के प्रोटोटाइप कोड से कॉल करना।

रीयलटाइम डेटाबेस और क्लाउड फ़ंक्शंस को शामिल करते हुए एक विस्तृत पूर्वाभ्यास उपलब्ध है। आपको स्थानीय एमुलेटर सूट परिचय पर भी एक नज़र डालनी चाहिए।

FIRDatabaseReference प्राप्त करें

डेटाबेस से डेटा पढ़ने या लिखने के लिए, आपको FIRDatabaseReference का एक उदाहरण चाहिए:

तीव्र

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
var ref: DatabaseReference!

ref = Database.database().reference()

उद्देश्य सी

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];

डेटा लिखें

इस दस्तावेज़ में Firebase डेटा पढ़ने और लिखने की मूल बातें शामिल हैं।

फायरबेस डेटा Database संदर्भ में लिखा जाता है और संदर्भ के लिए एक एसिंक्रोनस श्रोता को जोड़कर पुनर्प्राप्त किया जाता है। डेटा की प्रारंभिक स्थिति के लिए श्रोता को एक बार ट्रिगर किया जाता है और फिर कभी भी डेटा में परिवर्तन होता है।

बेसिक राइट ऑपरेशंस

बुनियादी लेखन कार्यों के लिए, आप किसी निर्दिष्ट संदर्भ में डेटा को सहेजने के लिए setValue का उपयोग कर सकते हैं, उस पथ पर किसी भी मौजूदा डेटा को प्रतिस्थापित कर सकते हैं। आप इस विधि का उपयोग इसके लिए कर सकते हैं:

  • पास प्रकार जो उपलब्ध JSON प्रकारों के अनुरूप हैं:
    • NSString
    • NSNumber
    • NSDictionary
    • NSArray

उदाहरण के लिए, आप एक उपयोगकर्ता को setValue के साथ इस प्रकार जोड़ सकते हैं:

तीव्र

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
self.ref.child("users").child(user.uid).setValue(["username": username])

उद्देश्य सी

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
[[[self.ref child:@"users"] child:authResult.user.uid]
    setValue:@{@"username": username}];

इस तरह से setValue का उपयोग किसी भी चाइल्ड नोड्स सहित निर्दिष्ट स्थान पर डेटा को अधिलेखित कर देता है। हालाँकि, आप अभी भी संपूर्ण ऑब्जेक्ट को फिर से लिखे बिना किसी बच्चे को अपडेट कर सकते हैं। यदि आप उपयोगकर्ताओं को अपनी प्रोफ़ाइल अपडेट करने की अनुमति देना चाहते हैं तो आप उपयोगकर्ता नाम को निम्नानुसार अपडेट कर सकते हैं:

तीव्र

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
self.ref.child("users/\(user.uid)/username").setValue(username)

उद्देश्य सी

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
[[[[_ref child:@"users"] child:user.uid] child:@"username"] setValue:username];

डेटा पढ़ें

महत्वपूर्ण घटनाओं को सुनकर डेटा पढ़ें

पथ पर डेटा पढ़ने और परिवर्तनों को सुनने के लिए, FIRDataEventTypeValue घटनाओं का निरीक्षण करने के लिए FIRDatabaseReference observeEventType:withBlock के ब्लॉक के साथ उपयोग करें।

घटना प्रकार विशिष्ट उपयोग
FIRDataEventTypeValue पथ की संपूर्ण सामग्री में परिवर्तन पढ़ें और सुनें।

आप दिए गए पथ पर डेटा पढ़ने के लिए FIRDataEventTypeValue ईवेंट का उपयोग कर सकते हैं, क्योंकि यह ईवेंट के समय मौजूद होता है। यह विधि एक बार चालू हो जाती है जब श्रोता संलग्न होता है और फिर से हर बार किसी भी बच्चे सहित डेटा बदलता है। ईवेंट कॉलबैक को एक snapshot पास किया जाता है जिसमें उस स्थान के सभी डेटा होते हैं, जिसमें चाइल्ड डेटा भी शामिल होता है। यदि कोई डेटा नहीं है, तो जब आप कॉल करते हैं तो स्नैपशॉट false वापसी करेगा exists() और nil जब आप इसकी value संपत्ति पढ़ते हैं।

निम्न उदाहरण डेटाबेस से किसी पोस्ट के विवरण को पुनर्प्राप्त करने वाले एक सामाजिक ब्लॉगिंग एप्लिकेशन को प्रदर्शित करता है:

तीव्र

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
refHandle = postRef.observe(DataEventType.value, with: { snapshot in
  // ...
})

उद्देश्य सी

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
_refHandle = [_postRef observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
  NSDictionary *postDict = snapshot.value;
  // ...
}];

श्रोता को एक FIRDataSnapshot प्राप्त होता है जिसमें घटना के समय डेटाबेस में निर्दिष्ट स्थान पर डेटा होता value । आप मानों को उपयुक्त मूल प्रकार, जैसे NSDictionary को असाइन कर सकते हैं। यदि स्थान पर कोई डेटा मौजूद नहीं है, तो value nil है।

एक बार डेटा पढ़ें

GetData () का उपयोग करके एक बार पढ़ें

एसडीके को डेटाबेस सर्वर के साथ बातचीत को प्रबंधित करने के लिए डिज़ाइन किया गया है, चाहे आपका ऐप ऑनलाइन हो या ऑफलाइन।

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

यदि आपको केवल एक बार डेटा की आवश्यकता है, तो आप डेटाबेस से डेटा का स्नैपशॉट प्राप्त करने के लिए getData() का उपयोग कर सकते हैं। यदि किसी कारण से getData() सर्वर मान वापस करने में असमर्थ है, तो क्लाइंट स्थानीय संग्रहण कैश की जांच करेगा और यदि मान अभी भी नहीं मिला है तो एक त्रुटि लौटाएगा।

निम्न उदाहरण डेटाबेस से एक बार उपयोगकर्ता के सार्वजनिक-सामना करने वाले उपयोगकर्ता नाम को पुनर्प्राप्त करने का प्रदर्शन करता है:

तीव्र

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
ref.child("users/\(uid)/username").getData(completion:  { error, snapshot in
  guard error == nil else {
    print(error!.localizedDescription)
    return;
  }
  let userName = snapshot.value as? String ?? "Unknown";
});

उद्देश्य सी

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
NSString *userPath = [NSString stringWithFormat:@"users/%@/username", uid];
[[ref child:userPath] getDataWithCompletionBlock:^(NSError * _Nullable error, FIRDataSnapshot * _Nonnull snapshot) {
  if (error) {
    NSLog(@"Received an error %@", error);
    return;
  }
  NSString *userName = snapshot.value;
}];

getData() का अनावश्यक उपयोग बैंडविड्थ के उपयोग को बढ़ा सकता है और प्रदर्शन के नुकसान का कारण बन सकता है, जिसे ऊपर दिखाए गए रीयलटाइम श्रोता का उपयोग करके रोका जा सकता है।

एक बार पर्यवेक्षक के साथ डेटा पढ़ें

कुछ मामलों में आप चाहते हैं कि सर्वर पर अद्यतन मान की जाँच करने के बजाय स्थानीय कैश से मान तुरंत लौटाया जाए। उन मामलों में आप तुरंत स्थानीय डिस्क कैश से डेटा प्राप्त करने के लिए observeSingleEventOfType का उपयोग कर सकते हैं।

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

तीव्र

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
let userID = Auth.auth().currentUser?.uid
ref.child("users").child(userID!).observeSingleEvent(of: .value, with: { snapshot in
  // Get user value
  let value = snapshot.value as? NSDictionary
  let username = value?["username"] as? String ?? ""
  let user = User(username: username)

  // ...
}) { error in
  print(error.localizedDescription)
}

उद्देश्य सी

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
NSString *userID = [FIRAuth auth].currentUser.uid;
[[[_ref child:@"users"] child:userID] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
  // Get user value
  User *user = [[User alloc] initWithUsername:snapshot.value[@"username"]];

  // ...
} withCancelBlock:^(NSError * _Nonnull error) {
  NSLog(@"%@", error.localizedDescription);
}];

डेटा अपडेट करना या हटाना

विशिष्ट फ़ील्ड अपडेट करें

अन्य चाइल्ड नोड्स को अधिलेखित किए बिना एक नोड के विशिष्ट बच्चों को एक साथ लिखने के लिए, updateChildValues ​​विधि का उपयोग करें।

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

तीव्र

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
guard let key = ref.child("posts").childByAutoId().key else { return }
let post = ["uid": userID,
            "author": username,
            "title": title,
            "body": body]
let childUpdates = ["/posts/\(key)": post,
                    "/user-posts/\(userID)/\(key)/": post]
ref.updateChildValues(childUpdates)

उद्देश्य सी

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
NSString *key = [[_ref child:@"posts"] childByAutoId].key;
NSDictionary *post = @{@"uid": userID,
                       @"author": username,
                       @"title": title,
                       @"body": body};
NSDictionary *childUpdates = @{[@"/posts/" stringByAppendingString:key]: post,
                               [NSString stringWithFormat:@"/user-posts/%@/%@/", userID, key]: post};
[_ref updateChildValues:childUpdates];

यह उदाहरण /posts/$postid postid पर सभी उपयोगकर्ताओं के लिए पोस्ट वाले नोड में पोस्ट बनाने के लिए childByAutoId का उपयोग करता है और साथ ही getKey() के साथ कुंजी पुनर्प्राप्त करता है। फिर कुंजी का उपयोग उपयोगकर्ता की पोस्ट में /user-posts/$userid/$postid पर दूसरी प्रविष्टि बनाने के लिए किया जा सकता है।

इन पथों का उपयोग करके, आप JSON ट्री में कई स्थानों पर एक साथ अपडेट कर सकते हैं, एक कॉल के साथ updateChildValues ​​, जैसे कि यह उदाहरण दोनों स्थानों में नई पोस्ट कैसे बनाता है। इस तरह से किए गए एक साथ अपडेट परमाणु हैं: या तो सभी अपडेट सफल होते हैं या सभी अपडेट विफल हो जाते हैं।

एक पूर्णता ब्लॉक जोड़ें

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

तीव्र

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
ref.child("users").child(user.uid).setValue(["username": username]) {
  (error:Error?, ref:DatabaseReference) in
  if let error = error {
    print("Data could not be saved: \(error).")
  } else {
    print("Data saved successfully!")
  }
}

उद्देश्य सी

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
[[[_ref child:@"users"] child:user.uid] setValue:@{@"username": username} withCompletionBlock:^(NSError *error, FIRDatabaseReference *ref) {
  if (error) {
    NSLog(@"Data could not be saved: %@", error);
  } else {
    NSLog(@"Data saved successfully.");
  }
}];

डेटा हटाएं

डेटा को हटाने का सबसे आसान तरीका उस डेटा के स्थान के संदर्भ में removeValue को कॉल करना है।

आप किसी अन्य लेखन कार्य जैसे कि setValue या updateChildValues ​​​​के लिए मान के रूप में nil निर्दिष्ट करके भी हटा सकते हैं। आप इस तकनीक का उपयोग updateChildValues ​​​​के साथ एक ही एपीआई कॉल में कई बच्चों को हटाने के लिए कर सकते हैं।

श्रोताओं को अलग करें

जब आप ViewController छोड़ते हैं तो पर्यवेक्षक स्वचालित रूप से डेटा सिंक करना बंद नहीं करते हैं। यदि पर्यवेक्षक को ठीक से नहीं हटाया जाता है, तो यह डेटा को स्थानीय मेमोरी में सिंक करना जारी रखता है। जब एक पर्यवेक्षक की अब आवश्यकता नहीं है, तो संबंधित FIRDatabaseHandle को removeObserverWithHandle विधि से पास करके इसे हटा दें।

जब आप किसी संदर्भ में कॉलबैक ब्लॉक जोड़ते हैं, तो FIRDatabaseHandle लौटाया जाता है। कॉलबैक ब्लॉक को हटाने के लिए इन हैंडल का उपयोग किया जा सकता है।

यदि डेटाबेस संदर्भ में एकाधिक श्रोताओं को जोड़ा गया है, तो प्रत्येक श्रोता को ईवेंट उठाए जाने पर बुलाया जाता है। उस स्थान पर डेटा सिंक करना बंद करने के लिए, आपको किसी स्थान पर सभी पर्यवेक्षकों को removeAllObservers विधि को कॉल करके निकालना होगा।

किसी श्रोता पर removeObserverWithHandle या removeAllObservers को कॉल करने से उसके चाइल्ड नोड्स पर पंजीकृत श्रोताओं को स्वचालित रूप से नहीं हटाया जाता है; आपको उन संदर्भों या हैंडल को हटाने के लिए उन पर भी नज़र रखनी चाहिए।

डेटा को लेनदेन के रूप में सहेजें

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

उदाहरण के लिए, उदाहरण के लिए सोशल ब्लॉगिंग ऐप में, आप उपयोगकर्ताओं को पोस्ट को स्टार और अनस्टार करने की अनुमति दे सकते हैं और यह ट्रैक कर सकते हैं कि पोस्ट को कितने स्टार मिले हैं:

तीव्र

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
ref.runTransactionBlock({ (currentData: MutableData) -> TransactionResult in
  if var post = currentData.value as? [String: AnyObject],
    let uid = Auth.auth().currentUser?.uid {
    var stars: [String: Bool]
    stars = post["stars"] as? [String: Bool] ?? [:]
    var starCount = post["starCount"] as? Int ?? 0
    if let _ = stars[uid] {
      // Unstar the post and remove self from stars
      starCount -= 1
      stars.removeValue(forKey: uid)
    } else {
      // Star the post and add self to stars
      starCount += 1
      stars[uid] = true
    }
    post["starCount"] = starCount as AnyObject?
    post["stars"] = stars as AnyObject?

    // Set value and report transaction success
    currentData.value = post

    return TransactionResult.success(withValue: currentData)
  }
  return TransactionResult.success(withValue: currentData)
}) { error, committed, snapshot in
  if let error = error {
    print(error.localizedDescription)
  }
}

उद्देश्य सी

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
[ref runTransactionBlock:^FIRTransactionResult * _Nonnull(FIRMutableData * _Nonnull currentData) {
  NSMutableDictionary *post = currentData.value;
  if (!post || [post isEqual:[NSNull null]]) {
    return [FIRTransactionResult successWithValue:currentData];
  }

  NSMutableDictionary *stars = post[@"stars"];
  if (!stars) {
    stars = [[NSMutableDictionary alloc] initWithCapacity:1];
  }
  NSString *uid = [FIRAuth auth].currentUser.uid;
  int starCount = [post[@"starCount"] intValue];
  if (stars[uid]) {
    // Unstar the post and remove self from stars
    starCount--;
    [stars removeObjectForKey:uid];
  } else {
    // Star the post and add self to stars
    starCount++;
    stars[uid] = @YES;
  }
  post[@"stars"] = stars;
  post[@"starCount"] = @(starCount);

  // Set value and report transaction success
  currentData.value = post;
  return [FIRTransactionResult successWithValue:currentData];
} andCompletionBlock:^(NSError * _Nullable error,
                       BOOL committed,
                       FIRDataSnapshot * _Nullable snapshot) {
  // Transaction completed
  if (error) {
    NSLog(@"%@", error.localizedDescription);
  }
}];

यदि एक से अधिक उपयोगकर्ता एक ही समय में एक ही पोस्ट को तारांकित करते हैं या क्लाइंट के पास पुराना डेटा होता है, तो लेन-देन का उपयोग करना स्टार काउंट को गलत होने से रोकता है। FIRMutableData वर्ग में निहित मान प्रारंभ में पथ के लिए क्लाइंट का अंतिम ज्ञात मान है, या यदि कोई नहीं है तो nil है। सर्वर अपने वर्तमान मूल्य के खिलाफ प्रारंभिक मूल्य की तुलना करता है और यदि मान मेल खाता है, या इसे अस्वीकार करता है तो लेनदेन स्वीकार करता है। यदि लेन-देन अस्वीकार कर दिया जाता है, तो सर्वर क्लाइंट को वर्तमान मान लौटाता है, जो अद्यतन मूल्य के साथ लेनदेन को फिर से चलाता है। यह तब तक दोहराया जाता है जब तक लेन-देन स्वीकार नहीं किया जाता है या बहुत अधिक प्रयास किए गए हैं।

परमाणु सर्वर-साइड वेतन वृद्धि

उपरोक्त उपयोग के मामले में हम डेटाबेस में दो मान लिख रहे हैं: उपयोगकर्ता की आईडी जो पोस्ट को तारांकित/अतारांकित करता है, और बढ़ी हुई स्टार गिनती। यदि हम पहले से ही जानते हैं कि उपयोगकर्ता पोस्ट को तारांकित कर रहा है, तो हम लेनदेन के बजाय परमाणु वृद्धि संचालन का उपयोग कर सकते हैं।

तीव्र

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
let updates = [
  "posts/\(postID)/stars/\(userID)": true,
  "posts/\(postID)/starCount": ServerValue.increment(1),
  "user-posts/\(postID)/stars/\(userID)": true,
  "user-posts/\(postID)/starCount": ServerValue.increment(1)
] as [String : Any]
Database.database().reference().updateChildValues(updates);

उद्देश्य सी

नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
NSDictionary *updates = @{[NSString stringWithFormat: @"posts/%@/stars/%@", postID, userID]: @TRUE,
                        [NSString stringWithFormat: @"posts/%@/starCount", postID]: [FIRServerValue increment:@1],
                        [NSString stringWithFormat: @"user-posts/%@/stars/%@", postID, userID]: @TRUE,
                        [NSString stringWithFormat: @"user-posts/%@/starCount", postID]: [FIRServerValue increment:@1]};
[[[FIRDatabase database] reference] updateChildValues:updates];

यह कोड लेन-देन संचालन का उपयोग नहीं करता है, इसलिए यदि कोई विरोधाभासी अद्यतन है तो यह स्वचालित रूप से फिर से नहीं चलता है। हालांकि, चूंकि इंक्रीमेंट ऑपरेशन सीधे डेटाबेस सर्वर पर होता है, इसलिए विरोध की कोई संभावना नहीं है।

यदि आप एप्लिकेशन-विशिष्ट विरोधों का पता लगाना और अस्वीकार करना चाहते हैं, जैसे कि कोई उपयोगकर्ता किसी ऐसी पोस्ट को अभिनीत करता है जिसे उन्होंने पहले ही तारांकित किया है, तो आपको उस उपयोग के मामले के लिए कस्टम सुरक्षा नियम लिखना चाहिए।

डेटा के साथ ऑफ़लाइन काम करें

यदि कोई क्लाइंट अपना नेटवर्क कनेक्शन खो देता है, तो आपका ऐप ठीक से काम करना जारी रखेगा।

फायरबेस डेटाबेस से जुड़ा प्रत्येक क्लाइंट किसी भी सक्रिय डेटा का अपना आंतरिक संस्करण रखता है। जब डेटा लिखा जाता है, तो इसे पहले इस स्थानीय संस्करण में लिखा जाता है। फायरबेस क्लाइंट तब उस डेटा को दूरस्थ डेटाबेस सर्वर और अन्य क्लाइंट के साथ "सर्वोत्तम-प्रयास" के आधार पर सिंक्रनाइज़ करता है।

नतीजतन, सर्वर पर कोई भी डेटा लिखे जाने से पहले, सभी डेटाबेस को लिखते हैं, स्थानीय घटनाओं को तुरंत ट्रिगर करते हैं। इसका मतलब है कि नेटवर्क विलंबता या कनेक्टिविटी की परवाह किए बिना आपका ऐप उत्तरदायी रहता है।

एक बार कनेक्टिविटी फिर से स्थापित हो जाने के बाद, आपका ऐप ईवेंट का उपयुक्त सेट प्राप्त करता है ताकि क्लाइंट बिना कोई कस्टम कोड लिखे, वर्तमान सर्वर स्थिति के साथ सिंक हो जाए।

हम ऑनलाइन और ऑफलाइन क्षमताओं के बारे में अधिक जानें में ऑफ़लाइन व्यवहार के बारे में अधिक बात करेंगे।

अगले कदम