(ज़रूरी नहीं) Firebase Local Emulator Suite के साथ प्रोटोटाइप बनाना और उसकी जांच करना
इससे पहले कि हम यह बताएं कि आपका ऐप्लिकेशन, Realtime Database से डेटा कैसे पढ़ता है और उसमें डेटा कैसे लिखता है, आइए हम आपको उन टूल के बारे में बताते हैं जिनका इस्तेमाल करके, Realtime Database की सुविधाओं का प्रोटोटाइप बनाया जा सकता है और उन्हें टेस्ट किया जा सकता है: Firebase Local Emulator Suite. अगर आपको अलग-अलग डेटा मॉडल आज़माने हैं, सुरक्षा नियमों को ऑप्टिमाइज़ करना है या बैक-एंड के साथ इंटरैक्ट करने का सबसे किफ़ायती तरीका ढूंढना है, तो लाइव सेवाओं को डिप्लॉय किए बिना स्थानीय तौर पर काम करना एक अच्छा विकल्प हो सकता है.
Realtime Database एम्युलेटर, Local Emulator Suite का हिस्सा है. इसकी मदद से, आपका ऐप्लिकेशन, एम्युलेट किए गए डेटाबेस के कॉन्टेंट और कॉन्फ़िगरेशन के साथ-साथ, एम्युलेट किए गए प्रोजेक्ट के संसाधनों (फ़ंक्शन, अन्य डेटाबेस, और सुरक्षा के नियम) के साथ इंटरैक्ट कर सकता है. हालांकि, ऐसा करना ज़रूरी नहीं है.
Realtime Database एम्युलेटर का इस्तेमाल करने के लिए, बस कुछ ही चरणों को पूरा करना होता है:
- एम्युलेटर से कनेक्ट करने के लिए, अपने ऐप्लिकेशन की टेस्ट कॉन्फ़िगरेशन में कोड की एक लाइन जोड़ें.
- अपनी लोकल प्रोजेक्ट डायरेक्ट्री के रूट से,
firebase emulators:start
चलाएं. - Realtime Database प्लैटफ़ॉर्म SDK का इस्तेमाल करके, अपने ऐप्लिकेशन के प्रोटोटाइप कोड से कॉल करें. इसके अलावा, Realtime Database REST API का इस्तेमाल करके भी कॉल किए जा सकते हैं.
Realtime Database और Cloud Functions को शामिल करके, ज़्यादा जानकारी वाला वॉकट्रू उपलब्ध है. आपको Local Emulator Suite के बारे में जानकारी भी देखनी चाहिए.
FIRDatabaseReference ऑब्जेक्ट पाना
डेटाबेस से डेटा पढ़ने या उसमें डेटा लिखने के लिए, आपको FIRDatabaseReference
के इंस्टेंस की ज़रूरत होगी:
Swift
var ref: DatabaseReference! ref = Database.database().reference()
Objective-C
@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
डेटा लिखने की अनुमति दें
इस दस्तावेज़ में, Firebase डेटा को पढ़ने और लिखने के बारे में बुनियादी जानकारी दी गई है.
Firebase डेटा को Database
रेफ़रंस में लिखा जाता है. साथ ही, रेफ़रंस में एसिंक्रोनस लिसनर अटैच करके इसे वापस पाया जाता है. लिसनर, डेटा की शुरुआती स्थिति के लिए एक बार ट्रिगर होता है. इसके बाद, जब भी डेटा में बदलाव होता है, तब यह ट्रिगर होता है.
लिखने की बुनियादी कार्रवाइयां
लिखने से जुड़ी बुनियादी कार्रवाइयों के लिए, setValue
का इस्तेमाल करके डेटा को किसी खास रेफ़रंस में सेव किया जा सकता है. इससे उस पाथ पर मौजूद मौजूदा डेटा बदल जाता है. इस तरीके का इस्तेमाल करके, ये काम किए जा सकते हैं:
- पास के टाइप, जो उपलब्ध JSON टाइप से मेल खाते हैं. ये इस तरह हैं:
NSString
NSNumber
NSDictionary
NSArray
उदाहरण के लिए, setValue
की भूमिका वाले उपयोगकर्ता को इस तरह जोड़ा जा सकता है:
Swift
self.ref.child("users").child(user.uid).setValue(["username": username])
Objective-C
[[[self.ref child:@"users"] child:authResult.user.uid] setValue:@{@"username": username}];
setValue
का इस तरह इस्तेमाल करने से, तय की गई जगह पर मौजूद डेटा मिट जाता है. इसमें चाइल्ड नोड भी शामिल हैं. हालांकि, पूरे ऑब्जेक्ट को फिर से लिखे बिना भी किसी बच्चे की जानकारी अपडेट की जा सकती है. अगर आपको उपयोगकर्ताओं को अपनी प्रोफ़ाइल अपडेट करने की अनुमति देनी है, तो उपयोगकर्ता नाम को इस तरह अपडेट करें:
Swift
self.ref.child("users/\(user.uid)/username").setValue(username)
Objective-C
[[[[_ref child:@"users"] child:user.uid] child:@"username"] setValue:username];
डेटा पढ़ने की अनुमति दें
वैल्यू इवेंट को मॉनिटर करके डेटा पढ़ना
किसी पाथ पर डेटा पढ़ने और बदलावों को सुनने के लिए, FIRDataEventTypeValue
इवेंट को मॉनिटर करने के लिए FIRDatabaseReference
के observeEventType:withBlock
का इस्तेमाल करें.
इवेंट प्रकार | आम तौर पर इस्तेमाल |
---|---|
FIRDataEventTypeValue |
किसी पाथ के पूरे कॉन्टेंट में हुए बदलावों को पढ़ना और सुनना. |
किसी दिए गए पाथ पर मौजूद डेटा को पढ़ने के लिए, FIRDataEventTypeValue
इवेंट का इस्तेमाल किया जा सकता है. यह डेटा, इवेंट के समय मौजूद होता है. यह तरीका तब ट्रिगर होता है, जब लिसनर अटैच होता है. इसके बाद, यह हर बार तब ट्रिगर होता है, जब डेटा में बदलाव होता है. इसमें बच्चों का डेटा भी शामिल है. इवेंट कॉलबैक को snapshot
पास किया जाता है. इसमें उस जगह का पूरा डेटा होता है. इसमें बच्चों का डेटा भी शामिल होता है. अगर कोई डेटा नहीं है, तो स्नैपशॉट false
दिखाएगा. ऐसा तब होगा, जब exists()
को कॉल किया जाएगा. साथ ही, जब इसकी value
प्रॉपर्टी को पढ़ा जाएगा, तब स्नैपशॉट nil
दिखाएगा.
यहां दिए गए उदाहरण में, सोशल ब्लॉगिंग ऐप्लिकेशन को डेटाबेस से पोस्ट की जानकारी मिलती है:
Swift
refHandle = postRef.observe(DataEventType.value, with: { snapshot in // ... })
Objective-C
_refHandle = [_postRef observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) { NSDictionary *postDict = snapshot.value; // ... }];
लिसनर को एक FIRDataSnapshot
मिलता है. इसमें, इवेंट के समय उसकी value
प्रॉपर्टी में डेटाबेस की तय की गई जगह पर मौजूद डेटा होता है. आपके पास वैल्यू को सही नेटिव टाइप असाइन करने का विकल्प होता है, जैसे कि NSDictionary
.
अगर किसी जगह का कोई डेटा मौजूद नहीं है, तो value
nil
होता है.
डेटा को एक बार पढ़ना
getData() का इस्तेमाल करके एक बार पढ़ना
एसडीके को डेटाबेस सर्वर के साथ इंटरैक्शन मैनेज करने के लिए डिज़ाइन किया गया है. इससे कोई फ़र्क़ नहीं पड़ता कि आपका ऐप्लिकेशन ऑनलाइन है या ऑफ़लाइन.
आम तौर पर, आपको ऊपर बताई गई वैल्यू इवेंट की तकनीकों का इस्तेमाल करके डेटा पढ़ना चाहिए. इससे आपको बैकएंड से डेटा में होने वाले अपडेट की सूचना मिल पाएगी. इन तकनीकों से, आपके इस्तेमाल और बिलिंग में कमी आती है. साथ ही, इन्हें इस तरह से ऑप्टिमाइज़ किया जाता है कि ऑनलाइन और ऑफ़लाइन होने पर, आपके उपयोगकर्ताओं को सबसे अच्छा अनुभव मिल सके.
अगर आपको डेटा सिर्फ़ एक बार चाहिए, तो डेटाबेस से डेटा का स्नैपशॉट पाने के लिए, getData()
का इस्तेमाल करें. अगर किसी वजह से getData()
, सर्वर वैल्यू नहीं दिखा पाता है, तो क्लाइंट लोकल स्टोरेज कैश मेमोरी की जांच करेगा. अगर वैल्यू अब भी नहीं मिलती है, तो वह गड़बड़ी का मैसेज दिखाएगा.
यहां दिए गए उदाहरण में, डेटाबेस से उपयोगकर्ता का सार्वजनिक तौर पर दिखने वाला उपयोगकर्ता नाम एक बार वापस पाने का तरीका बताया गया है:
Swift
do { let snapshot = try await ref.child("users/\(uid)/username").getData() let userName = snapshot.value as? String ?? "Unknown" } catch { print(error) }
Objective-C
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
का इस्तेमाल करके लोकल डिस्क कैश से डेटा तुरंत पाया जा सकता है.
यह उस डेटा के लिए फ़ायदेमंद है जिसे सिर्फ़ एक बार लोड करना होता है. साथ ही, जिसमें बार-बार बदलाव होने की संभावना नहीं होती या जिसे सुनने के लिए, डिवाइस के चालू रहने की ज़रूरत नहीं होती. उदाहरण के लिए, पिछले उदाहरणों में दिया गया ब्लॉगिंग ऐप्लिकेशन, इस तरीके का इस्तेमाल करके उपयोगकर्ता की प्रोफ़ाइल लोड करता है. ऐसा तब होता है, जब उपयोगकर्ता कोई नई पोस्ट लिखना शुरू करता है:
Swift
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) }
Objective-C
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
को कॉल करते समय, कुंजी के लिए पाथ तय करके, निचले लेवल की चाइल्ड वैल्यू अपडेट की जा सकती हैं. अगर डेटा को बेहतर तरीके से स्केल करने के लिए, उसे एक से ज़्यादा जगहों पर सेव किया जाता है, तो डेटा फ़ैन-आउट का इस्तेमाल करके, उस डेटा के सभी इंस्टेंस को अपडेट किया जा सकता है. उदाहरण के लिए, कोई सोशल ब्लॉगिंग ऐप्लिकेशन पोस्ट बनाना चाहता है. साथ ही, उसे हाल ही की गतिविधि फ़ीड और पोस्ट करने वाले उपयोगकर्ता की गतिविधि फ़ीड में अपडेट करना चाहता है. इसके लिए, ब्लॉगिंग ऐप्लिकेशन इस तरह के कोड का इस्तेमाल करता है:
Swift
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)
Objective-C
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
, दोनों में एक वैकल्पिक
कम्प्लीशन ब्लॉक होता है. इसे तब कॉल किया जाता है, जब डेटाबेस में लिखने की प्रोसेस पूरी हो जाती है. इस लिसनर का इस्तेमाल यह ट्रैक करने के लिए किया जा सकता है कि कौनसा डेटा सेव किया गया है और कौनसा डेटा अब भी सिंक किया जा रहा है. अगर कॉल पूरा नहीं हुआ, तो लिसनर को गड़बड़ी वाला ऑब्जेक्ट पास किया जाता है. इससे पता चलता है कि कॉल पूरा क्यों नहीं हुआ.
Swift
do { try await ref.child("users").child(user.uid).setValue(["username": username]) print("Data saved successfully!") } catch { print("Data could not be saved: \(error).") }
Objective-C
[[[_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
को कॉल करने से, चाइल्ड नोड पर रजिस्टर किए गए लिसनर अपने-आप नहीं हटते. आपको उन्हें हटाने के लिए, उन रेफ़रंस या हैंडल का भी ध्यान रखना होगा.
डेटा को लेन-देन के तौर पर सेव करना
अगर आपको ऐसे डेटा के साथ काम करना है जिसमें एक साथ कई बदलाव किए जा सकते हैं, तो लेन-देन के ऑपरेशन का इस्तेमाल किया जा सकता है. जैसे, इंक्रीमेंटल काउंटर. इस ऑपरेशन में दो आर्ग्युमेंट दिए जाते हैं: अपडेट फ़ंक्शन और पूरा होने पर कॉल करने वाला वैकल्पिक फ़ंक्शन. अपडेट फ़ंक्शन, डेटा की मौजूदा स्थिति को एक आर्ग्युमेंट के तौर पर लेता है. साथ ही, वह नई स्थिति दिखाता है जिसे आपको लिखना है.
उदाहरण के लिए, सोशल ब्लॉगिंग ऐप्लिकेशन में, उपयोगकर्ताओं को पोस्ट को स्टार करने और स्टार हटाने की अनुमति दी जा सकती है. साथ ही, यह ट्रैक किया जा सकता है कि किसी पोस्ट को कितने स्टार मिले हैं. इसके लिए, यह तरीका अपनाएं:
Swift
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) } }
Objective-C
[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
होती है. सर्वर, शुरुआती वैल्यू की तुलना मौजूदा वैल्यू से करता है. अगर वैल्यू मेल खाती हैं, तो लेन-देन स्वीकार कर लिया जाता है. अगर वैल्यू मेल नहीं खाती हैं, तो लेन-देन अस्वीकार कर दिया जाता है. अगर लेन-देन अस्वीकार कर दिया जाता है, तो सर्वर क्लाइंट को मौजूदा वैल्यू दिखाता है. इसके बाद, क्लाइंट अपडेट की गई वैल्यू के साथ लेन-देन को फिर से शुरू करता है. यह प्रोसेस तब तक दोहराई जाती है, जब तक लेन-देन स्वीकार नहीं हो जाता या बहुत ज़्यादा कोशिशें नहीं हो जातीं.
सर्वर-साइड से होने वाली एटॉमिक बढ़ोतरी
ऊपर दिए गए इस्तेमाल के उदाहरण में, हम डेटाबेस में दो वैल्यू लिख रहे हैं: पोस्ट को स्टार/अनस्टार करने वाले उपयोगकर्ता का आईडी और स्टार की बढ़ी हुई संख्या. अगर हमें पहले से पता है कि उपयोगकर्ता ने पोस्ट को स्टार किया है, तो हम लेन-देन के बजाय ऐटॉमिक इंक्रीमेंट ऑपरेशन का इस्तेमाल कर सकते हैं.
Swift
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)
Objective-C
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];
यह कोड, लेन-देन की कार्रवाई का इस्तेमाल नहीं करता. इसलिए, अगर कोई अपडेट टकराता है, तो यह अपने-आप फिर से नहीं चलता. हालांकि, इंक्रीमेंट ऑपरेशन सीधे तौर पर डेटाबेस सर्वर पर होता है. इसलिए, टकराव की कोई संभावना नहीं होती.
अगर आपको ऐप्लिकेशन से जुड़ी समस्याओं का पता लगाना है और उन्हें ठीक करना है, तो आपको इस्तेमाल के इस उदाहरण के लिए सुरक्षा के कस्टम नियम लिखने चाहिए. जैसे, किसी उपयोगकर्ता ने ऐसी पोस्ट को स्टार किया है जिसे वह पहले ही स्टार कर चुका है.
डेटा के साथ ऑफ़लाइन काम करना
अगर किसी क्लाइंट का नेटवर्क कनेक्शन बंद हो जाता है, तो आपका ऐप्लिकेशन ठीक से काम करता रहेगा.
Firebase डेटाबेस से कनेक्ट किया गया हर क्लाइंट, ऐक्टिव डेटा के अपने इंटरनल वर्शन को बनाए रखता है. डेटा को सबसे पहले इस लोकल वर्शन में लिखा जाता है. इसके बाद, Firebase क्लाइंट उस डेटा को रिमोट डेटाबेस सर्वर और अन्य क्लाइंट के साथ "बेस्ट-एफ़र्ट" के आधार पर सिंक करता है.
इस वजह से, डेटाबेस में कुछ भी लिखने पर, लोकल इवेंट तुरंत ट्रिगर हो जाते हैं. ऐसा सर्वर पर कोई भी डेटा लिखे जाने से पहले होता है. इसका मतलब है कि नेटवर्क की स्पीड कम होने या कनेक्टिविटी न होने पर भी, आपका ऐप्लिकेशन काम करता रहेगा.
कनेक्टिविटी फिर से चालू होने पर, आपके ऐप्लिकेशन को इवेंट का सही सेट मिलता है. इससे क्लाइंट, सर्वर की मौजूदा स्थिति के साथ सिंक हो जाता है. इसके लिए, आपको कोई कस्टम कोड लिखने की ज़रूरत नहीं होती.
हम ऑनलाइन और ऑफ़लाइन सुविधाओं के बारे में ज़्यादा जानें लेख में, ऑफ़लाइन व्यवहार के बारे में ज़्यादा जानकारी देंगे.