ডেটার তালিকা নিয়ে কাজ করুন

একটি ডাটাবেস রেফারেন্স নিন

ডাটাবেস থেকে ডেটা পড়তে বা লিখতে, আপনার DatabaseReference এর একটি ইনস্ট্যান্স প্রয়োজন।

DatabaseReference ref = FirebaseDatabase.instance.ref();

পঠন ও লিখন তালিকা

ডেটার তালিকায় যুক্ত করুন

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

push() মেথড দ্বারা ফেরত আসা নতুন ডেটার রেফারেন্স ব্যবহার করে আপনি চাইল্ডের স্বয়ংক্রিয়ভাবে তৈরি হওয়া কী-এর মান পেতে পারেন অথবা চাইল্ডের জন্য ডেটা সেট করতে পারেন। একটি push() ` রেফারেন্সের .key প্রপার্টিতে স্বয়ংক্রিয়ভাবে তৈরি হওয়া কী-টি থাকে।

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

উদাহরণস্বরূপ, কোনো সোশ্যাল অ্যাপ্লিকেশনের পোস্টের তালিকায় একটি নতুন পোস্ট যোগ করতে push() ব্যবহার করা যেতে পারে:

DatabaseReference postListRef = FirebaseDatabase.instance.ref("posts");
DatabaseReference newPostRef = postListRef.push();
newPostRef.set({
  // ...
});

শিশুদের অনুষ্ঠান সম্পর্কে শুনুন

কোনো নোডের চাইল্ডদের উপর নির্দিষ্ট কিছু অপারেশনের প্রতিক্রিয়ায় চাইল্ড ইভেন্ট ট্রিগার হয়; যেমন push() মেথডের মাধ্যমে একটি নতুন চাইল্ড যোগ করা হলে বা ` update() ` মেথডের মাধ্যমে কোনো চাইল্ড আপডেট করা হলে।

অনুষ্ঠান সাধারণ ব্যবহার
onChildAdded আইটেমের তালিকা পুনরুদ্ধার করুন অথবা আইটেমের তালিকায় নতুন সংযোজনের জন্য নজর রাখুন। এই ইভেন্টটি প্রতিটি বিদ্যমান চাইল্ডের জন্য একবার এবং তারপর নির্দিষ্ট পাথে যখনই একটি নতুন চাইল্ড যুক্ত হয়, তখন আবার ট্রিগার হয়। লিসেনারকে নতুন চাইল্ডের ডেটা সম্বলিত একটি স্ন্যাপশট পাঠানো হয়।
onChildChanged একটি তালিকার আইটেমগুলির পরিবর্তন পর্যবেক্ষণ করুন। যখনই কোনো চাইল্ড নোড পরিবর্তিত হয়, এই ইভেন্টটি ট্রিগার হয়। এর মধ্যে চাইল্ড নোডের ডিসেন্ডেন্টদের যেকোনো পরিবর্তনও অন্তর্ভুক্ত। ইভেন্ট লিসেনারে পাঠানো স্ন্যাপশটটিতে চাইল্ডের জন্য আপডেট করা ডেটা থাকে।
onChildRemoved তালিকা থেকে আইটেম মুছে ফেলার বিষয়টি শুনুন। যখন কোনো নিকটবর্তী চাইল্ড মুছে ফেলা হয়, তখন এই ইভেন্টটি ট্রিগার হয়। কলব্যাক ব্লকে পাঠানো স্ন্যাপশটটিতে মুছে ফেলা চাইল্ডটির ডেটা থাকে।
onChildMoved একটি অর্ডারড লিস্টে আইটেমগুলোর ক্রমের পরিবর্তন লক্ষ্য করুন। onChildMoved ইভেন্টটি সর্বদা সেই onChildChanged ইভেন্টের পরে আসে, যা আপনার বর্তমান order-by পদ্ধতির উপর ভিত্তি করে আইটেমটির ক্রম পরিবর্তন করে।

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

final commentsRef = FirebaseDatabase.instance.ref("post-comments/$postId");
commentsRef.onChildAdded.listen((event) {
  // A new comment has been added, so add it to the displayed list.
});
commentsRef.onChildChanged.listen((event) {
  // A comment has changed; use the key to determine if we are displaying this
  // comment and if so displayed the changed comment.
});
commentsRef.onChildRemoved.listen((event) {
  // A comment has been removed; use the key to determine if we are displaying
  // this comment and if so remove it.
});

মূল্যবান ঘটনাগুলোর জন্য কান পেতে শুনুন

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

কোনো ডেটার লিস্টে value লিসেনার সংযুক্ত করলে সম্পূর্ণ লিস্টটি একটি একক স্ন্যাপশট হিসেবে ফেরত আসবে, যেটির ওপর লুপ চালিয়ে আপনি প্রতিটি চাইল্ড অ্যাক্সেস করতে পারবেন।

কোয়েরির জন্য শুধুমাত্র একটি মিল থাকলেও, স্ন্যাপশটটি একটি তালিকাই থাকে; এতে কেবল একটি আইটেম থাকে। আইটেমটি অ্যাক্সেস করতে, আপনাকে ফলাফলের উপর একটি লুপ চালাতে হবে:

myTopPostsQuery.onValue.listen((event) {
  for (final child in event.snapshot.children) {
    // Handle the post.
  }
}, onError: (error) {
  // Error.
});

এই প্যাটার্নটি তখন কাজে আসতে পারে, যখন আপনি অতিরিক্ত চাইল্ড যুক্ত হওয়ার ইভেন্টগুলোর জন্য অপেক্ষা না করে, একটিমাত্র অপারেশনে কোনো লিস্টের সমস্ত চাইল্ডকে নিয়ে আসতে চান।

ডেটা সাজানো এবং ফিল্টার করা

আপনি Query ক্লাস ব্যবহার করে কী (key), ভ্যালু (value), বা কোনো চাইল্ডের ভ্যালু অনুসারে ডেটা সাজিয়ে পেতে পারেন। এছাড়াও, আপনি সাজানো ফলাফলকে একটি নির্দিষ্ট সংখ্যক ফলাফলে অথবা কী বা ভ্যালুর একটি পরিসরে ফিল্টার করতে পারেন।

ডেটা সাজান

সাজানো ডেটা পেতে, ফলাফল কীভাবে সাজানো হবে তা নির্ধারণ করতে প্রথমে order-by পদ্ধতিগুলোর মধ্যে একটি নির্দিষ্ট করুন:

পদ্ধতি ব্যবহার
orderByChild() একটি নির্দিষ্ট চাইল্ড কী বা নেস্টেড চাইল্ড পাথের মান অনুসারে ফলাফল সাজান।
orderByKey() চাইল্ড কী অনুসারে ফলাফলগুলো সাজান।
orderByValue() চাইল্ড ভ্যালু অনুসারে ফলাফলগুলো সাজান।

আপনি একবারে শুধুমাত্র একটি order-by মেথড ব্যবহার করতে পারবেন। একই কোয়েরিতে একাধিকবার order-by মেথড কল করলে একটি এরর দেখা দেয়।

নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে আপনি একজন ব্যবহারকারীর সেরা পোস্টগুলির একটি তালিকা তাদের স্টার সংখ্যা অনুসারে সাজিয়ে পেতে পারেন:

final myUserId = FirebaseAuth.instance.currentUser?.uid;
final topUserPostsRef = FirebaseDatabase.instance
    .ref("user-posts/$myUserId")
    .orderByChild("starCount");

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

orderByChild() মেথডটি কল করার মাধ্যমে কোন চাইল্ড কী-এর ভিত্তিতে ফলাফল সাজানো হবে তা নির্দিষ্ট করা হয়। এক্ষেত্রে, পোস্টগুলো তাদের নিজ নিজ "starCount" চাইল্ডের মান অনুসারে সাজানো হয়। কোয়েরিগুলো নেস্টেড চাইল্ড দ্বারাও সাজানো যেতে পারে, যদি আপনার ডেটা দেখতে এইরকম হয়:

"posts": {
  "ts-functions": {
    "metrics": {
      "views" : 1200000,
      "likes" : 251000,
      "shares": 1200,
    },
    "title" : "Why you should use TypeScript for writing Cloud Functions",
    "author": "Doug",
  },
  "android-arch-3": {
    "metrics": {
      "views" : 900000,
      "likes" : 117000,
      "shares": 144,
    },
    "title" : "Using Android Architecture Components with Firebase Realtime Database (Part 3)",
    "author": "Doug",
  }
},

এক্ষেত্রে, আমরা আমাদের orderByChild() কলে নেস্টেড চাইল্ডের রিলেটিভ পাথ উল্লেখ করে metrics কী-এর অধীনে থাকা ভ্যালু অনুসারে লিস্টের এলিমেন্টগুলোকে সাজাতে পারি।

final mostViewedPosts =
    FirebaseDatabase.instance.ref('posts').orderByChild('metrics/views');

অন্যান্য ডেটা টাইপগুলো কীভাবে সাজানো হয় সে সম্পর্কে আরও তথ্যের জন্য, “কোয়েরি ডেটা কীভাবে সাজানো হয়” দেখুন।

ডেটা ফিল্টার করা

কোয়েরি তৈরি করার সময় ডেটা ফিল্টার করতে আপনি limit বা range মেথডের যেকোনোটির সাথে order-by মেথড ব্যবহার করতে পারেন।

পদ্ধতি ব্যবহার
limitToFirst() ফলাফলের ক্রমিক তালিকার শুরু থেকে ফেরত দেওয়া আইটেমের সর্বোচ্চ সংখ্যা নির্ধারণ করে।
limitToLast() ফলাফলের ক্রমিক তালিকার শেষ থেকে ফেরত দেওয়া আইটেমের সর্বোচ্চ সংখ্যা নির্ধারণ করে।
startAt() নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে, নির্দিষ্ট কী বা মানের সমান বা তার চেয়ে বড় আইটেমগুলো ফেরত দেবে।
startAfter() নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে নির্দিষ্ট কী বা মানের চেয়ে বড় আইটেমগুলো ফেরত দেবে।
endAt() নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে, নির্দিষ্ট কী বা মানের সমান বা তার চেয়ে কম আইটেমগুলো ফেরত দেওয়া হবে।
endBefore() নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে নির্দিষ্ট কী বা মানের চেয়ে কম আইটেমগুলো ফেরত দেওয়া হবে।
equalTo() নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে, নির্দিষ্ট কী বা ভ্যালুর সমান আইটেমগুলো ফেরত দিন।

order-by মেথডগুলোর থেকে ভিন্নভাবে, আপনি একাধিক limit বা range ফাংশন একত্রিত করতে পারেন। উদাহরণস্বরূপ, ফলাফলকে একটি নির্দিষ্ট পরিসরের মধ্যে সীমাবদ্ধ করতে আপনি startAt() এবং endAt() মেথড দুটিকে একত্রিত করতে পারেন।

ফলাফলের সংখ্যা সীমিত করুন

আপনি একটি নির্দিষ্ট ইভেন্টের জন্য সিঙ্ক করা চাইল্ড আইটেমের সর্বোচ্চ সংখ্যা নির্ধারণ করতে limitToFirst() এবং limitToLast() মেথডগুলো ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি আপনি limitToFirst() ব্যবহার করে ১০০-এর একটি সীমা নির্ধারণ করেন, তাহলে আপনি প্রাথমিকভাবে সর্বোচ্চ ১০০টি onChildAdded ইভেন্ট পাবেন। যদি আপনার Firebase ডেটাবেসে ১০০টির কম আইটেম সংরক্ষিত থাকে, তাহলে প্রতিটি আইটেমের জন্য একটি করে onChildAdded ইভেন্ট ফায়ার হবে।

আইটেম পরিবর্তন হওয়ার সাথে সাথে, কোয়েরিতে নতুন যুক্ত হওয়া আইটেমগুলোর জন্য আপনি onChildAdded ইভেন্ট এবং কোয়েরি থেকে বাদ পড়া আইটেমগুলোর জন্য onChildRemoved ইভেন্ট পাবেন, যাতে মোট সংখ্যা ১০০-তেই স্থির থাকে।

নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে একটি উদাহরণ ব্লগিং অ্যাপ সমস্ত ব্যবহারকারীর ১০০টি সাম্প্রতিকতম পোস্টের একটি তালিকা পুনরুদ্ধার করার জন্য একটি কোয়েরি সংজ্ঞায়িত করে:

final recentPostsRef = FirebaseDatabase.instance.ref('posts').limitToLast(100);

এই উদাহরণটি শুধুমাত্র একটি কোয়েরি সংজ্ঞায়িত করে, প্রকৃতপক্ষে ডেটা সিঙ্ক্রোনাইজ করার জন্য এর সাথে একটি লিসেনার সংযুক্ত থাকা প্রয়োজন।

কী বা ভ্যালু দ্বারা ফিল্টার করুন

কোয়েরির জন্য ইচ্ছামতো শুরু, শেষ এবং সমতুল্য বিন্দু বেছে নিতে আপনি startAt() , startAfter() , endAt() , endBefore() , এবং equalTo() ব্যবহার করতে পারেন। ডেটা পেজিনেট করতে অথবা নির্দিষ্ট মানের চাইল্ড আইটেম আছে এমন আইটেম খুঁজে বের করতে এটি কার্যকর হতে পারে।

কোয়েরি ডেটা কীভাবে সাজানো হয়

এই অংশে Query ক্লাসের প্রতিটি order-by মেথড ব্যবহার করে কীভাবে ডেটা সর্ট করা হয় তা ব্যাখ্যা করা হয়েছে।

orderByChild

orderByChild() ব্যবহার করার সময়, নির্দিষ্ট চাইল্ড কী ধারণকারী ডেটা নিম্নলিখিতভাবে সাজানো হয়:

  1. নির্দিষ্ট চাইল্ড কী-এর মান null হলে চাইল্ডগুলো প্রথমে আসে।
  2. নির্দিষ্ট চাইল্ড কী-এর জন্য যেসব চাইল্ডের মান false , সেগুলো এরপরে আসে। যদি একাধিক চাইল্ডের মান false হয়, তবে সেগুলোকে কী অনুসারে আভিধানিকভাবে সাজানো হয়।
  3. নির্দিষ্ট চাইল্ড কী-এর মান ' true হলে চাইল্ডগুলো এরপরে আসে। যদি একাধিক চাইল্ডের মান ' true হয়, তবে সেগুলোকে কী অনুসারে আভিধানিকভাবে সাজানো হয়।
  4. সাংখ্যিক মানযুক্ত চাইল্ডগুলো এরপর আরোহী ক্রমে আসে। যদি নির্দিষ্ট চাইল্ড নোডটির জন্য একাধিক চাইল্ডের একই সাংখ্যিক মান থাকে, তবে সেগুলোকে কী (key) অনুসারে সাজানো হয়।
  5. সংখ্যার পরে স্ট্রিংগুলো আসে এবং আভিধানিকভাবে আরোহী ক্রমে সাজানো হয়। যদি নির্দিষ্ট চাইল্ড নোডের জন্য একাধিক চাইল্ডের একই মান থাকে, তবে সেগুলোকে কী (key) অনুসারে আভিধানিকভাবে সাজানো হয়।
  6. বস্তুগুলো শেষে আসে এবং চাবি অনুসারে আভিধানিকভাবে আরোহী ক্রমে সাজানো হয়।

orderByKey

orderByKey() ব্যবহার করে ডেটা সর্ট করার সময়, ডেটা কী (key) অনুসারে আরোহী ক্রমে ফেরত আসে।

  1. যেসব চাইল্ডের কী-কে ৩২-বিট পূর্ণসংখ্যা হিসেবে পার্স করা যায়, সেগুলো আরোহী ক্রমে প্রথমে আসে।
  2. যেসব চাইল্ডের কী (key) হিসেবে স্ট্রিং ভ্যালু রয়েছে, সেগুলো আভিধানিকভাবে আরোহী ক্রমে সাজানো অবস্থায় এরপরে আসে।

orderByValue

orderByValue() ব্যবহার করার সময়, চাইল্ড নোডগুলো তাদের ভ্যালু অনুসারে সাজানো হয়। সাজানোর মানদণ্ড orderByChild() এর মতোই, তবে এক্ষেত্রে একটি নির্দিষ্ট চাইল্ড কী-এর ভ্যালুর পরিবর্তে নোডটির ভ্যালু ব্যবহার করা হয়।

শ্রোতাদের বিচ্ছিন্ন করুন

আপনার Firebase ডাটাবেস রেফারেন্সে off() মেথডটি কল করার মাধ্যমে কলব্যাকগুলি সরিয়ে ফেলা হয়।

আপনি off() ফাংশনে প্যারামিটার হিসেবে একটি লিসেনার পাস করে সেটি সরাতে পারেন। কোনো আর্গুমেন্ট ছাড়া off() ফাংশনটি কল করলে সেই লোকেশনের সমস্ত লিসেনার মুছে যায়।

প্যারেন্ট লিসেনারে off() কল করলে তার চাইল্ড নোডগুলিতে রেজিস্টার করা লিসেনারগুলি স্বয়ংক্রিয়ভাবে মুছে যায় না; কলব্যাকটি সরাতে হলে যেকোনো চাইল্ড লিসেনারেও off() কল করতে হবে।

পরবর্তী পদক্ষেপ