ডেটা সংরক্ষণ করা হচ্ছে

এই নথিটি আপনার ফায়ারবেস রিয়েলটাইম ডেটাবেসে ডেটা লেখার জন্য চারটি পদ্ধতি কভার করে: সেট, আপডেট, পুশ এবং লেনদেন সমর্থন।

ডাটা সেভ করার উপায়

সেট একটি সংজ্ঞায়িত পথে ডেটা লিখুন বা প্রতিস্থাপন করুন, যেমন messages/users/<username>
হালনাগাদ সমস্ত ডেটা প্রতিস্থাপন না করে একটি সংজ্ঞায়িত পথের জন্য কিছু কী আপডেট করুন
ধাক্কা ডাটাবেসের তথ্যের তালিকায় যোগ করুন । আপনি যখনই একটি তালিকায় একটি নতুন নোড পুশ করেন, আপনার ডাটাবেস একটি অনন্য কী তৈরি করে, যেমন messages/users/<unique-user-id>/<username>
লেনদেন জটিল ডেটা নিয়ে কাজ করার সময় লেনদেনগুলি ব্যবহার করুন যা সমসাময়িক আপডেট দ্বারা দূষিত হতে পারে

ডেটা সংরক্ষণ করা হচ্ছে

বেসিক ডাটাবেস রাইটিং অপারেশন হল একটি সেট যা নির্দিষ্ট ডাটাবেস রেফারেন্সে নতুন ডেটা সংরক্ষণ করে, সেই পথে বিদ্যমান ডেটা প্রতিস্থাপন করে। সেট বোঝার জন্য, আমরা একটি সাধারণ ব্লগিং অ্যাপ তৈরি করব। আপনার অ্যাপের ডেটা এই ডাটাবেস রেফারেন্সে সংরক্ষণ করা হয়েছে:

জাভা
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');
পাইথন
# Import database module.
from firebase_admin import db

# Get a database reference to our blog.
ref = db.reference('server/saving-data/fireblog')
যাওয়া
// 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 পাস করা নির্দিষ্ট স্থানে ডেটা মুছে ফেলবে। এই ক্ষেত্রে আপনি এটি একটি বস্তু পাস করবেন:

জাভা
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'
  }
});
পাইথন
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'
    }
})
যাওয়া

// 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 অবজেক্ট ডাটাবেসে সংরক্ষিত হয়, তখন অবজেক্টের বৈশিষ্ট্যগুলি স্বয়ংক্রিয়ভাবে একটি নেস্টেড ফ্যাশনে ডাটাবেস চাইল্ড অবস্থানে ম্যাপ করা হয়। এখন আপনি URL-এ নেভিগেট করলে https://docs-examples.firebaseio.com/server/saving-data/fireblog/users/alanisawesome/full_name , আমরা "অ্যালান টুরিং" মান দেখতে পাব। এছাড়াও আপনি সরাসরি একটি শিশু অবস্থানে ডেটা সংরক্ষণ করতে পারেন:

জাভা
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'
});
পাইথন
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'
})
যাওয়া
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 অন্যান্য শিশুদের অপরিবর্তিত রেখে দেবে।

সংরক্ষিত ডেটা আপডেট করা হচ্ছে

আপনি যদি অন্যান্য চাইল্ড নোডগুলিকে ওভাররাইট না করে একই সময়ে একটি ডাটাবেস অবস্থানের একাধিক বাচ্চাদের কাছে লিখতে চান তবে আপনি নীচে দেখানো আপডেট পদ্ধতিটি ব্যবহার করতে পারেন:

জাভা
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'
});
পাইথন
hopper_ref = users_ref.child('gracehop')
hopper_ref.update({
    'nickname': 'Amazing Grace'
})
যাওয়া
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 উভয়ই মুছে ফেলত।

ফায়ারবেস রিয়েলটাইম ডেটাবেস মাল্টি-পাথ আপডেটগুলিকেও সমর্থন করে। এর মানে হল যে আপডেট এখন আপনার ডাটাবেসের একাধিক অবস্থানে একই সময়ে মান আপডেট করতে পারে, একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে আপনার ডেটাকে অস্বাভাবিক করতে সাহায্য করে। মাল্টি-পাথ আপডেট ব্যবহার করে, আপনি একই সময়ে গ্রেস এবং অ্যালান উভয়ের ডাকনাম যোগ করতে পারেন:

জাভা
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'
});
পাইথন
users_ref.update({
    'alanisawesome/nickname': 'Alan The Machine',
    'gracehop/nickname': 'Amazing Grace'
})
যাওয়া
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"
    }
  }
}

উল্লেখ্য যে অন্তর্ভুক্ত পাথগুলির সাথে অবজেক্ট লিখে অবজেক্ট আপডেট করার চেষ্টা করলে ভিন্ন আচরণ হবে। এর পরিবর্তে আপনি যদি গ্রেস এবং অ্যালানকে এইভাবে আপডেট করার চেষ্টা করেন তবে কী হবে তা একবার দেখে নেওয়া যাক:

জাভা
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'
  }
});
পাইথন
users_ref.update({
    'alanisawesome': {
        'nickname': 'Alan The Machine'
    },
    'gracehop': {
        'nickname': 'Amazing Grace'
    }
})
যাওয়া
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 Admin SDK-এ, আপনি যদি জানতে চান আপনার ডেটা কখন প্রতিশ্রুতিবদ্ধ হয়েছে, আপনি একটি সম্পূর্ণ কলব্যাক যোগ করতে পারেন। এই SDK-তে সেট এবং আপডেট উভয় পদ্ধতিই একটি ঐচ্ছিক সমাপ্তি কলব্যাক নেয় যা ডাটাবেসের সাথে লেখার প্রতিশ্রুতিবদ্ধ হলে বলা হয়। যদি কলটি কোনো কারণে ব্যর্থ হয়, তাহলে কলব্যাকটি কেন ব্যর্থ হয়েছে তা নির্দেশ করে একটি ত্রুটি অবজেক্ট পাস করা হয়। Python এবং Go Admin SDK-এ, সমস্ত লেখার পদ্ধতি ব্লক করা হচ্ছে। অর্থাৎ, লেখার পদ্ধতিগুলি ডাটাবেসের সাথে প্রতিশ্রুতিবদ্ধ না হওয়া পর্যন্ত ফিরে আসে না।

জাভা
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() ফাংশন প্রদান করে যা প্রতিটি নতুন সন্তানের জন্য একটি অনন্য কী তৈরি করে । অনন্য চাইল্ড কী ব্যবহার করে, অনেক ক্লায়েন্ট লেখার দ্বন্দ্ব সম্পর্কে চিন্তা না করে একই সময়ে একই স্থানে শিশুদের যোগ করতে পারে।

জাভা
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'
});
পাইথন
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'
})
যাওয়া

// 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)
}

অনন্য কী একটি টাইমস্ট্যাম্পের উপর ভিত্তি করে, তাই তালিকা আইটেমগুলি স্বয়ংক্রিয়ভাবে কালানুক্রমিকভাবে অর্ডার করা হবে। যেহেতু ফায়ারবেস প্রতিটি ব্লগ পোস্টের জন্য একটি অনন্য কী তৈরি করে, তাই একাধিক ব্যবহারকারী একই সময়ে একটি পোস্ট যোগ করলে কোনো লেখার বিরোধ হবে না। আপনার ডাটাবেস ডেটা এখন এইরকম দেখাচ্ছে:

{
  "posts": {
    "-JRHTHaIs-jNPLXOQivY": {
      "author": "gracehop",
      "title": "Announcing COBOL, a New Programming Language"
    },
    "-JRHTHaKuITFIhnj02kE": {
      "author": "alanisawesome",
      "title": "The Turing Machine"
    }
  }
}

জাভাস্ক্রিপ্ট, পাইথন এবং গো-তে, push() এবং তারপরে অবিলম্বে set() কল করার প্যাটার্নটি এতটাই সাধারণ যে ফায়ারবেস SDK আপনাকে সরাসরি push() এ সেট করা ডেটা পাস করে সেগুলিকে একত্রিত করতে দেয়:

জাভা
// No Java equivalent
Node.js
// This is equivalent to the calls to push().set(...) above
postsRef.push({
  author: 'gracehop',
  title: 'Announcing COBOL, a New Programming Language'
});;
পাইথন
# This is equivalent to the calls to push().set(...) above
posts_ref.push({
    'author': 'gracehop',
    'title': 'Announcing COBOL, a New Programming Language'
})
যাওয়া
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() নতুন ডেটা পাথের একটি রেফারেন্স ফিরিয়ে দেবে, যা আপনি কী পেতে বা এতে ডেটা সেট করতে ব্যবহার করতে পারেন। নিম্নলিখিত কোডটি উপরের উদাহরণের মতো একই ডেটাতে পরিণত হবে, কিন্তু এখন আমাদের কাছে তৈরি করা অনন্য কীটিতে অ্যাক্সেস থাকবে:

জাভা
// 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;
পাইথন
# 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
যাওয়া
// 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-এ, আপনি লেনদেন অপারেশন দুটি কলব্যাক দেন: একটি আপডেট ফাংশন এবং একটি ঐচ্ছিক সমাপ্তি কলব্যাক। পাইথন এবং গো-তে, লেনদেন অপারেশন ব্লক করা হচ্ছে এবং তাই এটি শুধুমাত্র আপডেট ফাংশন গ্রহণ করে।

আপডেট ফাংশন একটি যুক্তি হিসাবে ডেটার বর্তমান অবস্থা নেয় এবং আপনি লিখতে চান এমন নতুন পছন্দসই অবস্থাটি ফেরত দেওয়া উচিত। উদাহরণস্বরূপ, আপনি যদি একটি নির্দিষ্ট ব্লগ পোস্টে আপভোটের সংখ্যা বাড়াতে চান, তাহলে আপনি নিম্নলিখিত মত একটি লেনদেন লিখবেন:

জাভা
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;
});
পাইথন
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')
যাওয়া
fn := func(t db.TransactionNode) (interface{}, error) {
	var currentValue int
	if err := t.Unmarshal(&currentValue); 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 ব্যবহার করে একটি অ্যাপ্লিকেশন লেখেন, তখন নেটওয়ার্ক লেটেন্সি বা ইন্টারনেট সংযোগ নির্বিশেষে আপনার অ্যাপ প্রতিক্রিয়াশীল থাকবে।

একবার সংযোগ পুনঃস্থাপিত হলে, আমরা ইভেন্টের উপযুক্ত সেট পাব যাতে ক্লায়েন্ট বর্তমান সার্ভারের অবস্থার সাথে "ক্যাচ আপ" করে, কোনো কাস্টম কোড না লিখে।

আপনার ডেটা সুরক্ষিত করা

ফায়ারবেস রিয়েলটাইম ডেটাবেসের একটি সুরক্ষা ভাষা রয়েছে যা আপনাকে নির্ধারণ করতে দেয় কোন ব্যবহারকারীরা আপনার ডেটার বিভিন্ন নোডে পড়তে এবং লেখার অ্যাক্সেস পেয়েছে। আপনি সিকিউর ইওর ডেটাতে এটি সম্পর্কে আরও পড়তে পারেন।