इस दस्तावेज़ में, Firebase Realtime Database में डेटा लिखने के चार तरीकों के बारे में बताया गया है: सेट, अपडेट, पुश, और लेन-देन की सुविधा.
डेटा सेव करने के तरीके
| सेट | **तय किए गए पाथ** पर डेटा लिखना या बदलना. जैसे, messages/users/<username> |
| अपडेट | पूरे डेटा को बदले बिना, तय किए गए पाथ के लिए कुछ कुंजियों को अपडेट करना |
| पुश | डेटाबेस में डेटा की सूची में जोड़ना. जब भी सूची में कोई नया नोड पुश किया जाता है, तो आपका डेटाबेस एक यूनीक कुंजी जनरेट करता है. जैसे, messages/users/<unique-user-id>/<username> |
| लेन-देन | लेन-देन की सुविधा का इस्तेमाल तब करें, जब आपको ऐसे जटिल डेटा के साथ काम करना हो जिसे एक साथ कई अपडेट करने पर नुकसान हो सकता है |
डेटा सेव करना
डेटाबेस में डेटा लिखने का बुनियादी तरीका सेट है. इससे तय किए गए डेटाबेस रेफ़रंस में नया डेटा सेव किया जाता है. साथ ही, उस पाथ पर मौजूद मौजूदा डेटा को बदल दिया जाता है. सेट को समझने के लिए, हम ब्लॉगिंग का एक आसान ऐप्लिकेशन बनाएंगे. आपके ऐप्लिकेशन का डेटा, इस डेटाबेस रेफ़रंस में सेव किया जाता है:
Java
final FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference ref = database.getReference("server/saving-data/fireblog");
Node.js
// Import Admin SDK const { getDatabase } = require('firebase-admin/database'); // Get a database reference to our blog const db = getDatabase(); const ref = db.ref('server/saving-data/fireblog');
Python
# Import database module. from firebase_admin import db # Get a database reference to our blog. ref = db.reference('server/saving-data/fireblog')
Go
// Create a database client from App. client, err := app.Database(ctx) if err != nil { log.Fatalln("Error initializing database client:", err) } // Get a database reference to our blog. ref := client.NewRef("server/saving-data/fireblog")
आइए, उपयोगकर्ता का कुछ डेटा सेव करके शुरू करते हैं. हम हर उपयोगकर्ता को एक यूनीक उपयोगकर्ता नाम से सेव करेंगे. साथ ही, हम उनका पूरा नाम और जन्म की तारीख भी सेव करेंगे. हर उपयोगकर्ता का उपयोगकर्ता नाम यूनीक होगा. इसलिए, यहां पुश तरीके के बजाय सेट तरीके का इस्तेमाल करना सही है. इसकी वजह यह है कि आपके पास पहले से ही कुंजी मौजूद है और आपको नई कुंजी बनाने की ज़रूरत नहीं है.
सबसे पहले, उपयोगकर्ता के डेटा के लिए डेटाबेस रेफ़रंस बनाएं. इसके बाद, उपयोगकर्ता का ऑब्जेक्ट डेटाबेस में सेव करने के लिए, set() / setValue() का इस्तेमाल करें. इसमें उपयोगकर्ता का नाम, पूरा नाम, और जन्म की तारीख शामिल होगी. सेट में स्ट्रिंग, नंबर, बूलियन, null, कलेक्शन या कोई भी JSON ऑब्जेक्ट पास किया जा सकता है. null पास करने पर, तय की गई जगह पर मौजूद डेटा हट जाएगा. इस मामले में, आपको इसे एक ऑब्जेक्ट पास करना होगा:
Java
public static class User { public String date_of_birth; public String full_name; public String nickname; public User(String dateOfBirth, String fullName) { // ... } public User(String dateOfBirth, String fullName, String nickname) { // ... } } DatabaseReference usersRef = ref.child("users"); Map<String, User> users = new HashMap<>(); users.put("alanisawesome", new User("June 23, 1912", "Alan Turing")); users.put("gracehop", new User("December 9, 1906", "Grace Hopper")); usersRef.setValueAsync(users);
Node.js
const usersRef = ref.child('users'); usersRef.set({ alanisawesome: { date_of_birth: 'June 23, 1912', full_name: 'Alan Turing' }, gracehop: { date_of_birth: 'December 9, 1906', full_name: 'Grace Hopper' } });
Python
users_ref = ref.child('users') users_ref.set({ 'alanisawesome': { 'date_of_birth': 'June 23, 1912', 'full_name': 'Alan Turing' }, 'gracehop': { 'date_of_birth': 'December 9, 1906', 'full_name': 'Grace Hopper' } })
Go
// User is a json-serializable type. type User struct { DateOfBirth string `json:"date_of_birth,omitempty"` FullName string `json:"full_name,omitempty"` Nickname string `json:"nickname,omitempty"` } usersRef := ref.Child("users") err := usersRef.Set(ctx, map[string]*User{ "alanisawesome": { DateOfBirth: "June 23, 1912", FullName: "Alan Turing", }, "gracehop": { DateOfBirth: "December 9, 1906", FullName: "Grace Hopper", }, }) if err != nil { log.Fatalln("Error setting value:", err) }
जब किसी JSON ऑब्जेक्ट को डेटाबेस में सेव किया जाता है, तो ऑब्जेक्ट की प्रॉपर्टी को नेस्ट किए गए तरीके से, डेटाबेस के चाइल्ड की जगहों पर अपने-आप मैप कर दिया जाता है. अब अगर हम https://docs-examples.firebaseio.com/server/saving-data/fireblog/users/alanisawesome/full_name यूआरएल पर जाते हैं, तो हमें "Alan Turing" वैल्यू दिखेगी. डेटा को सीधे तौर पर चाइल्ड की जगह पर भी सेव किया जा सकता है:
Java
usersRef.child("alanisawesome").setValueAsync(new User("June 23, 1912", "Alan Turing")); usersRef.child("gracehop").setValueAsync(new User("December 9, 1906", "Grace Hopper"));
Node.js
const usersRef = ref.child('users'); usersRef.child('alanisawesome').set({ date_of_birth: 'June 23, 1912', full_name: 'Alan Turing' }); usersRef.child('gracehop').set({ date_of_birth: 'December 9, 1906', full_name: 'Grace Hopper' });
Python
users_ref.child('alanisawesome').set({ 'date_of_birth': 'June 23, 1912', 'full_name': 'Alan Turing' }) users_ref.child('gracehop').set({ 'date_of_birth': 'December 9, 1906', 'full_name': 'Grace Hopper' })
Go
if err := usersRef.Child("alanisawesome").Set(ctx, &User{ DateOfBirth: "June 23, 1912", FullName: "Alan Turing", }); err != nil { log.Fatalln("Error setting value:", err) } if err := usersRef.Child("gracehop").Set(ctx, &User{ DateOfBirth: "December 9, 1906", FullName: "Grace Hopper", }); err != nil { log.Fatalln("Error setting value:", err) }
ऊपर दिए गए दोनों उदाहरणों में, डेटाबेस में एक ही डेटा सेव होगा. पहले उदाहरण में, दोनों वैल्यू को एक साथ ऑब्जेक्ट के तौर पर लिखा गया है. वहीं, दूसरे उदाहरण में, दोनों वैल्यू को चाइल्ड की जगहों पर अलग-अलग लिखा गया है:
{
"users": {
"alanisawesome": {
"date_of_birth": "June 23, 1912",
"full_name": "Alan Turing"
},
"gracehop": {
"date_of_birth": "December 9, 1906",
"full_name": "Grace Hopper"
}
}
}
पहले उदाहरण में, डेटा देखने वाले क्लाइंट पर सिर्फ़ एक इवेंट ट्रिगर होगा. वहीं, दूसरे उदाहरण में
में दो इवेंट ट्रिगर होंगे. ध्यान दें कि अगर usersRef पर पहले से डेटा मौजूद था, तो पहले तरीके से
वह डेटा ओवरराइट हो जाएगा. हालांकि, दूसरे तरीके से usersRef के अन्य चाइल्ड में कोई बदलाव नहीं होगा. इसमें सिर्फ़ हर चाइल्ड नोड की वैल्यू में बदलाव होगा.
सेव किए गए डेटा को अपडेट करना
अगर आपको डेटाबेस की किसी जगह के कई चाइल्ड में एक साथ डेटा लिखना है और अन्य चाइल्ड नोड को ओवरराइट नहीं करना है, तो अपडेट तरीके का इस्तेमाल किया जा सकता है. इसके बारे में यहां बताया गया है:
Java
DatabaseReference hopperRef = usersRef.child("gracehop"); Map<String, Object> hopperUpdates = new HashMap<>(); hopperUpdates.put("nickname", "Amazing Grace"); hopperRef.updateChildrenAsync(hopperUpdates);
Node.js
const usersRef = ref.child('users'); const hopperRef = usersRef.child('gracehop'); hopperRef.update({ 'nickname': 'Amazing Grace' });
Python
hopper_ref = users_ref.child('gracehop') hopper_ref.update({ 'nickname': 'Amazing Grace' })
Go
hopperRef := usersRef.Child("gracehop") if err := hopperRef.Update(ctx, map[string]interface{}{ "nickname": "Amazing Grace", }); err != nil { log.Fatalln("Error updating child:", err) }
इससे ग्रेस का डेटा अपडेट हो जाएगा और उसमें उसका निकनेम शामिल हो जाएगा. अगर आपने यहां अपडेट के बजाय सेट का इस्तेमाल किया होता,
तो आपके hopperRef से full_name और date_of_birth, दोनों हट जाते.
Firebase Realtime Database मल्टी-पाथ अपडेट की सुविधा भी देता है. इसका मतलब है कि अब अपडेट की मदद से, आपके डेटाबेस में एक साथ कई जगहों पर वैल्यू अपडेट की जा सकती हैं. यह एक काम की सुविधा है, जिससे आपको अपने डेटा को डीनॉर्मलाइज़ करने में मदद मिलती है. मल्टी-पाथ अपडेट का इस्तेमाल करके, ग्रेस और ऐलन, दोनों के निकनेम एक साथ जोड़े जा सकते हैं:
Java
Map<String, Object> userUpdates = new HashMap<>(); userUpdates.put("alanisawesome/nickname", "Alan The Machine"); userUpdates.put("gracehop/nickname", "Amazing Grace"); usersRef.updateChildrenAsync(userUpdates);
Node.js
const usersRef = ref.child('users'); usersRef.update({ 'alanisawesome/nickname': 'Alan The Machine', 'gracehop/nickname': 'Amazing Grace' });
Python
users_ref.update({ 'alanisawesome/nickname': 'Alan The Machine', 'gracehop/nickname': 'Amazing Grace' })
Go
if err := usersRef.Update(ctx, map[string]interface{}{ "alanisawesome/nickname": "Alan The Machine", "gracehop/nickname": "Amazing Grace", }); err != nil { log.Fatalln("Error updating children:", err) }
इस अपडेट के बाद, ऐलन और ग्रेस, दोनों के निकनेम जुड़ गए हैं:
{
"users": {
"alanisawesome": {
"date_of_birth": "June 23, 1912",
"full_name": "Alan Turing",
"nickname": "Alan The Machine"
},
"gracehop": {
"date_of_birth": "December 9, 1906",
"full_name": "Grace Hopper",
"nickname": "Amazing Grace"
}
}
}ध्यान दें कि पाथ शामिल करके ऑब्जेक्ट लिखकर, ऑब्जेक्ट अपडेट करने की कोशिश करने पर अलग-अलग नतीजे मिलेंगे. आइए, देखते हैं कि अगर आपने ग्रेस और ऐलन को इस तरह अपडेट करने की कोशिश की, तो क्या होगा:
Java
Map<String, Object> userNicknameUpdates = new HashMap<>(); userNicknameUpdates.put("alanisawesome", new User(null, null, "Alan The Machine")); userNicknameUpdates.put("gracehop", new User(null, null, "Amazing Grace")); usersRef.updateChildrenAsync(userNicknameUpdates);
Node.js
const usersRef = ref.child('users'); usersRef.update({ 'alanisawesome': { 'nickname': 'Alan The Machine' }, 'gracehop': { 'nickname': 'Amazing Grace' } });
Python
users_ref.update({ 'alanisawesome': { 'nickname': 'Alan The Machine' }, 'gracehop': { 'nickname': 'Amazing Grace' } })
Go
if err := usersRef.Update(ctx, map[string]interface{}{ "alanisawesome": &User{Nickname: "Alan The Machine"}, "gracehop": &User{Nickname: "Amazing Grace"}, }); err != nil { log.Fatalln("Error updating children:", err) }
इससे अलग नतीजा मिलता है. जैसे, पूरा /users नोड ओवरराइट हो जाता है:
{
"users": {
"alanisawesome": {
"nickname": "Alan The Machine"
},
"gracehop": {
"nickname": "Amazing Grace"
}
}
}पूरा होने पर कॉलबैक जोड़ना
Node.js और Java एडमिन SDK टूल में, अगर आपको यह जानना है कि आपका डेटा कब सबमिट किया गया है, तो पूरा होने पर कॉलबैक जोड़ा जा सकता है. इन SDK टूल में, सेट और अपडेट, दोनों तरीकों में पूरा होने पर कॉलबैक जोड़ने का विकल्प होता है. डेटाबेस में डेटा सबमिट होने पर, यह कॉलबैक कॉल किया जाता है. अगर किसी वजह से कॉल पूरा नहीं हो पाया, तो कॉलबैक में गड़बड़ी का ऑब्जेक्ट पास किया जाता है. इससे यह पता चलता है कि गड़बड़ी क्यों हुई. Python और Go एडमिन SDK टूल में, डेटा लिखने के सभी तरीके ब्लॉक किए जाते हैं. इसका मतलब है कि डेटाबेस में डेटा सबमिट होने तक, डेटा लिखने के तरीके कोई नतीजा नहीं दिखाते.
Java
DatabaseReference dataRef = ref.child("data"); dataRef.setValue("I'm writing data", new DatabaseReference.CompletionListener() { @Override public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { if (databaseError != null) { System.out.println("Data could not be saved " + databaseError.getMessage()); } else { System.out.println("Data saved successfully."); } } });
Node.js
dataRef.set('I\'m writing data', (error) => { if (error) { console.log('Data could not be saved.' + error); } else { console.log('Data saved successfully.'); } });
डेटा की सूचियां सेव करना
डेटा की सूचियां बनाते समय, यह ध्यान रखना ज़रूरी है कि ज़्यादातर ऐप्लिकेशन का इस्तेमाल कई लोग करते हैं. इसलिए, अपनी सूची का स्ट्रक्चर उसी हिसाब से बनाएं. ऊपर दिए गए उदाहरण को आगे बढ़ाते हुए, आइए अपने ऐप्लिकेशन में ब्लॉग पोस्ट जोड़ते हैं. आपकी पहली प्रतिक्रिया सेट का इस्तेमाल करके, ऑटो-इंक्रीमेंट होने वाले इंटिजर इंडेक्स वाले चाइल्ड सेव करने की हो सकती है. जैसे, यहां दिया गया उदाहरण:
// NOT RECOMMENDED - use push() instead! { "posts": { "0": { "author": "gracehop", "title": "Announcing COBOL, a New Programming Language" }, "1": { "author": "alanisawesome", "title": "The Turing Machine" } } }
अगर कोई उपयोगकर्ता नई पोस्ट जोड़ता है, तो वह /posts/2 के तौर पर सेव होगी. यह तब काम करेगा, जब सिर्फ़ एक लेखक
पोस्ट जोड़ रहा हो. हालांकि, ब्लॉगिंग के लिए बनाए गए आपके ऐप्लिकेशन में, कई उपयोगकर्ता एक साथ पोस्ट जोड़ सकते हैं. अगर
दो लेखक एक साथ /posts/2 पर लिखते हैं, तो एक पोस्ट दूसरी पोस्ट से मिट जाएगी.
इस समस्या को हल करने के लिए, Firebase क्लाइंट एक push() फ़ंक्शन उपलब्ध कराते हैं. इससे हर नए चाइल्ड के लिए एक
यूनीक कुंजी जनरेट होती है. यूनीक चाइल्ड कुंजियों का इस्तेमाल करके, कई क्लाइंट एक ही जगह पर एक साथ चाइल्ड जोड़ सकते हैं. इसके लिए, उन्हें डेटा लिखने से जुड़ी गड़बड़ियों के बारे में चिंता करने की ज़रूरत नहीं होती.
Java
public static class Post { public String author; public String title; public Post(String author, String title) { // ... } } DatabaseReference postsRef = ref.child("posts"); DatabaseReference newPostRef = postsRef.push(); newPostRef.setValueAsync(new Post("gracehop", "Announcing COBOL, a New Programming Language")); // We can also chain the two calls together postsRef.push().setValueAsync(new Post("alanisawesome", "The Turing Machine"));
Node.js
const newPostRef = postsRef.push(); newPostRef.set({ author: 'gracehop', title: 'Announcing COBOL, a New Programming Language' }); // we can also chain the two calls together postsRef.push().set({ author: 'alanisawesome', title: 'The Turing Machine' });
Python
posts_ref = ref.child('posts') new_post_ref = posts_ref.push() new_post_ref.set({ 'author': 'gracehop', 'title': 'Announcing COBOL, a New Programming Language' }) # We can also chain the two calls together posts_ref.push().set({ 'author': 'alanisawesome', 'title': 'The Turing Machine' })
Go
// Post is a json-serializable type. type Post struct { Author string `json:"author,omitempty"` Title string `json:"title,omitempty"` } postsRef := ref.Child("posts") newPostRef, err := postsRef.Push(ctx, nil) if err != nil { log.Fatalln("Error pushing child node:", err) } if err := newPostRef.Set(ctx, &Post{ Author: "gracehop", Title: "Announcing COBOL, a New Programming Language", }); err != nil { log.Fatalln("Error setting value:", err) } // We can also chain the two calls together if _, err := postsRef.Push(ctx, &Post{ Author: "alanisawesome", Title: "The Turing Machine", }); err != nil { log.Fatalln("Error pushing child node:", err) }
यूनीक कुंजी, टाइमस्टैंप पर आधारित होती है. इसलिए, सूची के आइटम अपने-आप क्रम से लग जाएंगे. Firebase, हर ब्लॉग पोस्ट के लिए एक यूनीक कुंजी जनरेट करता है. इसलिए, अगर कई उपयोगकर्ता एक साथ कोई पोस्ट जोड़ते हैं, तो डेटा लिखने से जुड़ी कोई गड़बड़ी नहीं होगी. अब आपके डेटाबेस का डेटा इस तरह दिखेगा:
{
"posts": {
"-JRHTHaIs-jNPLXOQivY": {
"author": "gracehop",
"title": "Announcing COBOL, a New Programming Language"
},
"-JRHTHaKuITFIhnj02kE": {
"author": "alanisawesome",
"title": "The Turing Machine"
}
}
}
JavaScript, Python, और Go में, push() को कॉल करने और उसके तुरंत बाद set() को कॉल करने का पैटर्न इतना आम है कि Firebase SDK टूल, आपको इन दोनों को एक साथ इस्तेमाल करने की सुविधा देता है. इसके लिए, सेट किया जाने वाला डेटा सीधे तौर पर push() में पास करें. जैसे:
Java
// No Java equivalentNode.js
// This is equivalent to the calls to push().set(...) above postsRef.push({ author: 'gracehop', title: 'Announcing COBOL, a New Programming Language' });;
Python
# This is equivalent to the calls to push().set(...) above posts_ref.push({ 'author': 'gracehop', 'title': 'Announcing COBOL, a New Programming Language' })
Go
if _, err := postsRef.Push(ctx, &Post{ Author: "gracehop", Title: "Announcing COBOL, a New Programming Language", }); err != nil { log.Fatalln("Error pushing child node:", err) }
पुश() से जनरेट की गई यूनीक कुंजी पाना
push() को कॉल करने पर, नए डेटा पाथ का रेफ़रंस मिलेगा. इसका इस्तेमाल कुंजी पाने या इसमें डेटा सेट करने के लिए किया जा सकता है. नीचे दिए गए कोड से, ऊपर दिए गए उदाहरण जैसा ही डेटा मिलेगा. हालांकि, अब हमारे पास जनरेट की गई यूनीक कुंजी का ऐक्सेस होगा:
Java
// Generate a reference to a new location and add some data using push() DatabaseReference pushedPostRef = postsRef.push(); // Get the unique ID generated by a push() String postId = pushedPostRef.getKey();
Node.js
// Generate a reference to a new location and add some data using push() const newPostRef = postsRef.push(); // Get the unique key generated by push() const postId = newPostRef.key;
Python
# Generate a reference to a new location and add some data using push() new_post_ref = posts_ref.push() # Get the unique key generated by push() post_id = new_post_ref.key
Go
// Generate a reference to a new location and add some data using Push() newPostRef, err := postsRef.Push(ctx, nil) if err != nil { log.Fatalln("Error pushing child node:", err) } // Get the unique key generated by Push() postID := newPostRef.Key
जैसा कि देखा जा सकता है, push() रेफ़रंस से यूनीक कुंजी की वैल्यू पाई जा सकती है.
लेन-देन से जुड़ा डेटा सेव करना
जब आपको ऐसे जटिल डेटा के साथ काम करना हो जिसे एक साथ कई बदलाव करने पर नुकसान हो सकता है, तो SDK टूल, लेन-देन की सुविधा देता है. जैसे, इंक्रीमेंटल काउंटर.
Java और Node.js में, लेन-देन की सुविधा के लिए दो कॉलबैक दिए जाते हैं: एक अपडेट फ़ंक्शन और दूसरा, पूरा होने पर कॉलबैक (यह ज़रूरी नहीं है). Python और Go में, लेन-देन की सुविधा ब्लॉक की जाती है. इसलिए, इसमें सिर्फ़ अपडेट फ़ंक्शन का इस्तेमाल किया जा सकता है.
अपडेट फ़ंक्शन, डेटा की मौजूदा स्थिति को आर्ग्युमेंट के तौर पर लेता है. साथ ही, इसे वह नई स्थिति दिखानी चाहिए जिसे आपको लिखना है. उदाहरण के लिए, अगर आपको किसी खास ब्लॉग पोस्ट पर अपवोट की संख्या बढ़ानी है, तो आपको इस तरह का लेन-देन लिखना होगा:
Java
DatabaseReference upvotesRef = ref.child("server/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes"); upvotesRef.runTransaction(new Transaction.Handler() { @Override public Transaction.Result doTransaction(MutableData mutableData) { Integer currentValue = mutableData.getValue(Integer.class); if (currentValue == null) { mutableData.setValue(1); } else { mutableData.setValue(currentValue + 1); } return Transaction.success(mutableData); } @Override public void onComplete( DatabaseError databaseError, boolean committed, DataSnapshot dataSnapshot) { System.out.println("Transaction completed"); } });
Node.js
const upvotesRef = db.ref('server/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes'); upvotesRef.transaction((current_value) => { return (current_value || 0) + 1; });
Python
def increment_votes(current_value): return current_value + 1 if current_value else 1 upvotes_ref = db.reference('server/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes') try: new_vote_count = upvotes_ref.transaction(increment_votes) print('Transaction completed') except db.TransactionAbortedError: print('Transaction failed to commit')
Go
fn := func(t db.TransactionNode) (interface{}, error) { var currentValue int if err := t.Unmarshal(¤tValue); err != nil { return nil, err } return currentValue + 1, nil } ref := client.NewRef("server/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes") if err := ref.Transaction(ctx, fn); err != nil { log.Fatalln("Transaction failed to commit:", err) }
ऊपर दिए गए उदाहरण में, यह देखा जाता है कि काउंटर null है या नहीं. साथ ही, यह भी देखा जाता है कि इसे अब तक बढ़ाया गया है या नहीं,
ऐसा इसलिए, क्योंकि अगर डिफ़ॉल्ट वैल्यू नहीं लिखी गई है, तो लेन-देन को null के साथ कॉल किया जा सकता है.
अगर ऊपर दिया गया कोड, लेन-देन फ़ंक्शन के बिना चलाया गया होता और दो क्लाइंट ने इसे एक साथ बढ़ाने की कोशिश की होती, तो दोनों क्लाइंट नई वैल्यू के तौर पर 1 लिखते. इससे दो के बजाय सिर्फ़ एक इंक्रीमेंट होता.
नेटवर्क कनेक्टिविटी और ऑफ़लाइन डेटा लिखना
Firebase Node.js और Java क्लाइंट, किसी भी चालू डेटा का अपना इंटरनल वर्शन बनाए रखते हैं. डेटा लिखे जाने पर, उसे सबसे पहले इस लोकल वर्शन में लिखा जाता है. इसके बाद, क्लाइंट उस डेटा को डेटाबेस और अन्य क्लाइंट के साथ 'बेस्ट-एफ़र्ट' के आधार पर सिंक करता है.
नतीजतन, डेटाबेस में डेटा लिखे जाने से पहले ही, डेटाबेस में लिखे जाने वाले सभी डेटा के लिए लोकल इवेंट ट्रिगर हो जाएंगे डेटाबेस. इसका मतलब है कि Firebase का इस्तेमाल करके ऐप्लिकेशन लिखने पर, आपका ऐप्लिकेशन नेटवर्क की समस्या या इंटरनेट कनेक्टिविटी न होने पर भी, काम करता रहेगा.
कनेक्टिविटी फिर से चालू होने पर, हमें इवेंट का सही सेट मिलेगा. इससे क्लाइंट को कोई कस्टम कोड लिखे बिना, मौजूदा सर्वर की स्थिति के साथ "अप-टू-डेट" रहने में मदद मिलेगी.
अपने डेटा को सुरक्षित रखना
Firebase Realtime Database में, सुरक्षा से जुड़ी एक भाषा होती है. इसकी मदद से, यह तय किया जा सकता है कि किन उपयोगकर्ताओं के पास आपके डेटा के अलग-अलग नोड को पढ़ने और लिखने का ऐक्सेस है. इसके बारे में ज़्यादा जानने के लिए, अपने डेटा को सुरक्षित रखना लेख पढ़ें.