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

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

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

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

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

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

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

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

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

तीव्र

नोट: यह Firebase उत्पाद अनुप्रयोग क्लिप लक्ष्य पर उपलब्ध नहीं है।
var ref: DatabaseReference!

ref = Database.database().reference()

उद्देश्य सी

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

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

डेटा लिखें

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

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

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

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

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

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

तीव्र

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

उद्देश्य सी

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

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

तीव्र

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

उद्देश्य सी

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

डेटा पढ़ें

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

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

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

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

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

तीव्र

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

उद्देश्य सी

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

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

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

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

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

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

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

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

तीव्र

नोट: यह Firebase उत्पाद अनुप्रयोग क्लिप लक्ष्य पर उपलब्ध नहीं है।
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";
});

उद्देश्य सी

नोट: यह Firebase उत्पाद अनुप्रयोग क्लिप लक्ष्य पर उपलब्ध नहीं है।
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 तुरंत स्थानीय डिस्क कैश से डेटा प्राप्त करने।

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

तीव्र

नोट: यह Firebase उत्पाद अनुप्रयोग क्लिप लक्ष्य पर उपलब्ध नहीं है।
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)
}

उद्देश्य सी

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

तीव्र

नोट: यह Firebase उत्पाद अनुप्रयोग क्लिप लक्ष्य पर उपलब्ध नहीं है।
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)

उद्देश्य सी

नोट: यह Firebase उत्पाद अनुप्रयोग क्लिप लक्ष्य पर उपलब्ध नहीं है।
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];

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

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

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

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

तीव्र

नोट: यह Firebase उत्पाद अनुप्रयोग क्लिप लक्ष्य पर उपलब्ध नहीं है।
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!")
  }
}

उद्देश्य सी

नोट: यह Firebase उत्पाद अनुप्रयोग क्लिप लक्ष्य पर उपलब्ध नहीं है।
[[[_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 कि डेटा के स्थान के लिए एक संदर्भ पर।

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

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

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

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

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

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

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

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

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

तीव्र

नोट: यह Firebase उत्पाद अनुप्रयोग क्लिप लक्ष्य पर उपलब्ध नहीं है।
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)
  }
}

उद्देश्य सी

नोट: यह Firebase उत्पाद अनुप्रयोग क्लिप लक्ष्य पर उपलब्ध नहीं है।
[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 है, तो कोई भी नहीं है। सर्वर अपने वर्तमान मूल्य के खिलाफ प्रारंभिक मूल्य की तुलना करता है और यदि मान मेल खाता है, या इसे अस्वीकार करता है तो लेनदेन स्वीकार करता है। यदि लेन-देन अस्वीकार कर दिया जाता है, तो सर्वर क्लाइंट को वर्तमान मान लौटाता है, जो अद्यतन मूल्य के साथ लेनदेन को फिर से चलाता है। यह तब तक दोहराया जाता है जब तक लेन-देन स्वीकार नहीं किया जाता है या बहुत अधिक प्रयास किए गए हैं।

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

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

तीव्र

नोट: यह Firebase उत्पाद अनुप्रयोग क्लिप लक्ष्य पर उपलब्ध नहीं है।
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);

उद्देश्य सी

नोट: यह Firebase उत्पाद अनुप्रयोग क्लिप लक्ष्य पर उपलब्ध नहीं है।
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];

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

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

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

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

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

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

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

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

अगला कदम