वेब पर डेटा पढ़ें और लिखें

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

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

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

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

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

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

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

डेटाबेस संदर्भ प्राप्त करें

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

Web version 9

import { getDatabase } from "firebase/database";

const database = getDatabase();

Web version 8

var database = firebase.database();

डेटा लिखें

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

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

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

बुनियादी लेखन कार्यों के लिए, आप किसी निर्दिष्ट संदर्भ में डेटा को सहेजने के लिए set() का उपयोग कर सकते हैं, उस पथ पर किसी भी मौजूदा डेटा को बदल सकते हैं। उदाहरण के लिए एक सामाजिक ब्लॉगिंग एप्लिकेशन एक उपयोगकर्ता को set() के साथ जोड़ सकता है:

Web version 9

import { getDatabase, ref, set } from "firebase/database";

function writeUserData(userId, name, email, imageUrl) {
  const db = getDatabase();
  set(ref(db, 'users/' + userId), {
    username: name,
    email: email,
    profile_picture : imageUrl
  });
}

Web version 8

function writeUserData(userId, name, email, imageUrl) {
  firebase.database().ref('users/' + userId).set({
    username: name,
    email: email,
    profile_picture : imageUrl
  });
}

set() का उपयोग किसी भी बच्चे के नोड्स सहित निर्दिष्ट स्थान पर डेटा को अधिलेखित कर देता है।

डेटा पढ़ें

महत्वपूर्ण घटनाओं के लिए सुनें

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

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

Web version 9

import { getDatabase, ref, onValue} from "firebase/database";

const db = getDatabase();
const starCountRef = ref(db, 'posts/' + postId + '/starCount');
onValue(starCountRef, (snapshot) => {
  const data = snapshot.val();
  updateStarCount(postElement, data);
});

Web version 8

var starCountRef = firebase.database().ref('posts/' + postId + '/starCount');
starCountRef.on('value', (snapshot) => {
  const data = snapshot.val();
  updateStarCount(postElement, data);
});

श्रोता को एक snapshot प्राप्त होता है जिसमें घटना के समय डेटाबेस में निर्दिष्ट स्थान पर डेटा होता है। आप snapshot में डेटा को val() विधि से पुनः प्राप्त कर सकते हैं।

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

प्राप्त करने के साथ एक बार डेटा पढ़ें ()

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

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

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

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

Web version 9

import { getDatabase, ref, child, get } from "firebase/database";

const dbRef = ref(getDatabase());
get(child(dbRef, `users/${userId}`)).then((snapshot) => {
  if (snapshot.exists()) {
    console.log(snapshot.val());
  } else {
    console.log("No data available");
  }
}).catch((error) => {
  console.error(error);
});

Web version 8

const dbRef = firebase.database().ref();
dbRef.child("users").child(userId).get().then((snapshot) => {
  if (snapshot.exists()) {
    console.log(snapshot.val());
  } else {
    console.log("No data available");
  }
}).catch((error) => {
  console.error(error);
});

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

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

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

Web version 9

import { getDatabase, ref, onValue } from "firebase/database";
import { getAuth } from "firebase/auth";

const db = getDatabase();
const auth = getAuth();

const userId = auth.currentUser.uid;
return onValue(ref(db, '/users/' + userId), (snapshot) => {
  const username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
  // ...
}, {
  onlyOnce: true
});

Web version 8

var userId = firebase.auth().currentUser.uid;
return firebase.database().ref('/users/' + userId).once('value').then((snapshot) => {
  var username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
  // ...
});

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

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

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

update() को कॉल करते समय, आप कुंजी के लिए पथ निर्दिष्ट करके निम्न-स्तरीय बाल मानों को अपडेट कर सकते हैं। यदि डेटा को कई स्थानों पर बेहतर पैमाने पर संग्रहीत किया जाता है, तो आप डेटा फैन-आउट का उपयोग करके उस डेटा के सभी उदाहरणों को अपडेट कर सकते हैं।

उदाहरण के लिए, एक सामाजिक ब्लॉगिंग ऐप एक पोस्ट बना सकता है और साथ ही इसे हाल की गतिविधि फ़ीड और पोस्टिंग उपयोगकर्ता की गतिविधि फ़ीड में इस तरह के कोड का उपयोग करके अपडेट कर सकता है:

Web version 9

import { getDatabase, ref, child, push, update } from "firebase/database";

function writeNewPost(uid, username, picture, title, body) {
  const db = getDatabase();

  // A post entry.
  const postData = {
    author: username,
    uid: uid,
    body: body,
    title: title,
    starCount: 0,
    authorPic: picture
  };

  // Get a key for a new Post.
  const newPostKey = push(child(ref(db), 'posts')).key;

  // Write the new post's data simultaneously in the posts list and the user's post list.
  const updates = {};
  updates['/posts/' + newPostKey] = postData;
  updates['/user-posts/' + uid + '/' + newPostKey] = postData;

  return update(ref(db), updates);
}

Web version 8

function writeNewPost(uid, username, picture, title, body) {
  // A post entry.
  var postData = {
    author: username,
    uid: uid,
    body: body,
    title: title,
    starCount: 0,
    authorPic: picture
  };

  // Get a key for a new Post.
  var newPostKey = firebase.database().ref().child('posts').push().key;

  // Write the new post's data simultaneously in the posts list and the user's post list.
  var updates = {};
  updates['/posts/' + newPostKey] = postData;
  updates['/user-posts/' + uid + '/' + newPostKey] = postData;

  return firebase.database().ref().update(updates);
}

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

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

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

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

Web version 9

import { getDatabase, ref, set } from "firebase/database";

const db = getDatabase();
set(ref(db, 'users/' + userId), {
  username: name,
  email: email,
  profile_picture : imageUrl
})
.then(() => {
  // Data saved successfully!
})
.catch((error) => {
  // The write failed...
});

Web version 8

firebase.database().ref('users/' + userId).set({
  username: name,
  email: email,
  profile_picture : imageUrl
}, (error) => {
  if (error) {
    // The write failed...
  } else {
    // Data saved successfully!
  }
});

डेटा हटाएं

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

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

एक Promise प्राप्त करें

यह जानने के लिए कि आपका डेटा Firebase रीयलटाइम डेटाबेस सर्वर के लिए कब प्रतिबद्ध है, आप एक Promise का उपयोग कर सकते हैं। दोनों set() और update() एक Promise वापस कर सकते हैं जिसका उपयोग आप यह जानने के लिए कर सकते हैं कि लेखन कब डेटाबेस के लिए प्रतिबद्ध है।

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

आपके फायरबेस डेटाबेस संदर्भ पर off() विधि को कॉल करके कॉलबैक हटा दिए जाते हैं।

आप किसी एकल श्रोता को off() के पैरामीटर के रूप में पास करके उसे हटा सकते हैं। बिना किसी तर्क के स्थान पर कॉल off() उस स्थान के सभी श्रोताओं को हटा देता है।

माता-पिता श्रोता पर कॉल off() अपने बच्चे के नोड्स पर पंजीकृत श्रोताओं को स्वचालित रूप से नहीं हटाता है; off() कॉलबैक को हटाने के लिए किसी भी बाल श्रोताओं पर भी कॉल किया जाना चाहिए।

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

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

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

Web version 9

import { getDatabase, ref, runTransaction } from "firebase/database";

function toggleStar(uid) {
  const db = getDatabase();
  const postRef = ref(db, '/posts/foo-bar-123');

  runTransaction(postRef, (post) => {
    if (post) {
      if (post.stars && post.stars[uid]) {
        post.starCount--;
        post.stars[uid] = null;
      } else {
        post.starCount++;
        if (!post.stars) {
          post.stars = {};
        }
        post.stars[uid] = true;
      }
    }
    return post;
  });
}

Web version 8

function toggleStar(postRef, uid) {
  postRef.transaction((post) => {
    if (post) {
      if (post.stars && post.stars[uid]) {
        post.starCount--;
        post.stars[uid] = null;
      } else {
        post.starCount++;
        if (!post.stars) {
          post.stars = {};
        }
        post.stars[uid] = true;
      }
    }
    return post;
  });
}

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

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

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

function addStar(uid, key) {
  const updates = {};
  updates[`posts/${key}/stars/${uid}`] = true;
  updates[`posts/${key}/starCount`] = firebase.database.ServerValue.increment(1);
  updates[`user-posts/${key}/stars/${uid}`] = true;
  updates[`user-posts/${key}/starCount`] = firebase.database.ServerValue.increment(1);
  firebase.database().ref().update(updates);
}

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

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

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

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

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

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

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

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

अगले कदम

,

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

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

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

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

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

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

डेटाबेस संदर्भ प्राप्त करें

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

Web version 9

import { getDatabase } from "firebase/database";

const database = getDatabase();

Web version 8

var database = firebase.database();

डेटा लिखें

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

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

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

बुनियादी लेखन कार्यों के लिए, आप किसी निर्दिष्ट संदर्भ में डेटा को सहेजने के लिए set() का उपयोग कर सकते हैं, उस पथ पर किसी भी मौजूदा डेटा को बदल सकते हैं। उदाहरण के लिए एक सामाजिक ब्लॉगिंग एप्लिकेशन एक उपयोगकर्ता को set() के साथ जोड़ सकता है:

Web version 9

import { getDatabase, ref, set } from "firebase/database";

function writeUserData(userId, name, email, imageUrl) {
  const db = getDatabase();
  set(ref(db, 'users/' + userId), {
    username: name,
    email: email,
    profile_picture : imageUrl
  });
}

Web version 8

function writeUserData(userId, name, email, imageUrl) {
  firebase.database().ref('users/' + userId).set({
    username: name,
    email: email,
    profile_picture : imageUrl
  });
}

set() का उपयोग किसी भी बच्चे के नोड्स सहित निर्दिष्ट स्थान पर डेटा को अधिलेखित कर देता है।

डेटा पढ़ें

महत्वपूर्ण घटनाओं के लिए सुनें

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

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

Web version 9

import { getDatabase, ref, onValue} from "firebase/database";

const db = getDatabase();
const starCountRef = ref(db, 'posts/' + postId + '/starCount');
onValue(starCountRef, (snapshot) => {
  const data = snapshot.val();
  updateStarCount(postElement, data);
});

Web version 8

var starCountRef = firebase.database().ref('posts/' + postId + '/starCount');
starCountRef.on('value', (snapshot) => {
  const data = snapshot.val();
  updateStarCount(postElement, data);
});

श्रोता को एक snapshot प्राप्त होता है जिसमें घटना के समय डेटाबेस में निर्दिष्ट स्थान पर डेटा होता है। आप snapshot में डेटा को val() विधि से पुनः प्राप्त कर सकते हैं।

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

प्राप्त करने के साथ एक बार डेटा पढ़ें ()

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

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

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

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

Web version 9

import { getDatabase, ref, child, get } from "firebase/database";

const dbRef = ref(getDatabase());
get(child(dbRef, `users/${userId}`)).then((snapshot) => {
  if (snapshot.exists()) {
    console.log(snapshot.val());
  } else {
    console.log("No data available");
  }
}).catch((error) => {
  console.error(error);
});

Web version 8

const dbRef = firebase.database().ref();
dbRef.child("users").child(userId).get().then((snapshot) => {
  if (snapshot.exists()) {
    console.log(snapshot.val());
  } else {
    console.log("No data available");
  }
}).catch((error) => {
  console.error(error);
});

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

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

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

Web version 9

import { getDatabase, ref, onValue } from "firebase/database";
import { getAuth } from "firebase/auth";

const db = getDatabase();
const auth = getAuth();

const userId = auth.currentUser.uid;
return onValue(ref(db, '/users/' + userId), (snapshot) => {
  const username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
  // ...
}, {
  onlyOnce: true
});

Web version 8

var userId = firebase.auth().currentUser.uid;
return firebase.database().ref('/users/' + userId).once('value').then((snapshot) => {
  var username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
  // ...
});

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

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

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

update() को कॉल करते समय, आप कुंजी के लिए पथ निर्दिष्ट करके निम्न-स्तरीय बाल मानों को अपडेट कर सकते हैं। यदि डेटा को कई स्थानों पर बेहतर पैमाने पर संग्रहीत किया जाता है, तो आप डेटा फैन-आउट का उपयोग करके उस डेटा के सभी उदाहरणों को अपडेट कर सकते हैं।

उदाहरण के लिए, एक सामाजिक ब्लॉगिंग ऐप एक पोस्ट बना सकता है और साथ ही इसे हाल की गतिविधि फ़ीड और पोस्टिंग उपयोगकर्ता की गतिविधि फ़ीड में इस तरह के कोड का उपयोग करके अपडेट कर सकता है:

Web version 9

import { getDatabase, ref, child, push, update } from "firebase/database";

function writeNewPost(uid, username, picture, title, body) {
  const db = getDatabase();

  // A post entry.
  const postData = {
    author: username,
    uid: uid,
    body: body,
    title: title,
    starCount: 0,
    authorPic: picture
  };

  // Get a key for a new Post.
  const newPostKey = push(child(ref(db), 'posts')).key;

  // Write the new post's data simultaneously in the posts list and the user's post list.
  const updates = {};
  updates['/posts/' + newPostKey] = postData;
  updates['/user-posts/' + uid + '/' + newPostKey] = postData;

  return update(ref(db), updates);
}

Web version 8

function writeNewPost(uid, username, picture, title, body) {
  // A post entry.
  var postData = {
    author: username,
    uid: uid,
    body: body,
    title: title,
    starCount: 0,
    authorPic: picture
  };

  // Get a key for a new Post.
  var newPostKey = firebase.database().ref().child('posts').push().key;

  // Write the new post's data simultaneously in the posts list and the user's post list.
  var updates = {};
  updates['/posts/' + newPostKey] = postData;
  updates['/user-posts/' + uid + '/' + newPostKey] = postData;

  return firebase.database().ref().update(updates);
}

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

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

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

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

Web version 9

import { getDatabase, ref, set } from "firebase/database";

const db = getDatabase();
set(ref(db, 'users/' + userId), {
  username: name,
  email: email,
  profile_picture : imageUrl
})
.then(() => {
  // Data saved successfully!
})
.catch((error) => {
  // The write failed...
});

Web version 8

firebase.database().ref('users/' + userId).set({
  username: name,
  email: email,
  profile_picture : imageUrl
}, (error) => {
  if (error) {
    // The write failed...
  } else {
    // Data saved successfully!
  }
});

डेटा हटाएं

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

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

एक Promise प्राप्त करें

यह जानने के लिए कि आपका डेटा Firebase रीयलटाइम डेटाबेस सर्वर के लिए कब प्रतिबद्ध है, आप एक Promise का उपयोग कर सकते हैं। दोनों set() और update() एक Promise वापस कर सकते हैं जिसका उपयोग आप यह जानने के लिए कर सकते हैं कि लेखन कब डेटाबेस के लिए प्रतिबद्ध है।

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

आपके फायरबेस डेटाबेस संदर्भ पर off() विधि को कॉल करके कॉलबैक हटा दिए जाते हैं।

आप किसी एकल श्रोता को off() के पैरामीटर के रूप में पास करके उसे हटा सकते हैं। बिना किसी तर्क के स्थान पर कॉल off() उस स्थान के सभी श्रोताओं को हटा देता है।

माता-पिता श्रोता पर कॉल off() अपने बच्चे के नोड्स पर पंजीकृत श्रोताओं को स्वचालित रूप से नहीं हटाता है; off() कॉलबैक को हटाने के लिए किसी भी बाल श्रोताओं पर भी कॉल किया जाना चाहिए।

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

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

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

Web version 9

import { getDatabase, ref, runTransaction } from "firebase/database";

function toggleStar(uid) {
  const db = getDatabase();
  const postRef = ref(db, '/posts/foo-bar-123');

  runTransaction(postRef, (post) => {
    if (post) {
      if (post.stars && post.stars[uid]) {
        post.starCount--;
        post.stars[uid] = null;
      } else {
        post.starCount++;
        if (!post.stars) {
          post.stars = {};
        }
        post.stars[uid] = true;
      }
    }
    return post;
  });
}

Web version 8

function toggleStar(postRef, uid) {
  postRef.transaction((post) => {
    if (post) {
      if (post.stars && post.stars[uid]) {
        post.starCount--;
        post.stars[uid] = null;
      } else {
        post.starCount++;
        if (!post.stars) {
          post.stars = {};
        }
        post.stars[uid] = true;
      }
    }
    return post;
  });
}

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

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

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

function addStar(uid, key) {
  const updates = {};
  updates[`posts/${key}/stars/${uid}`] = true;
  updates[`posts/${key}/starCount`] = firebase.database.ServerValue.increment(1);
  updates[`user-posts/${key}/stars/${uid}`] = true;
  updates[`user-posts/${key}/starCount`] = firebase.database.ServerValue.increment(1);
  firebase.database().ref().update(updates);
}

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

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

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

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

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

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

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

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

अगले कदम