C++ এর জন্য ফায়ারবেস রিয়েলটাইম ডেটাবেস দিয়ে ডেটা পুনরুদ্ধার করা হচ্ছে

এই দস্তাবেজটি ডেটা পুনরুদ্ধারের মূল বিষয়গুলি কভার করে এবং কীভাবে Firebase ডেটা অর্ডার এবং ফিল্টার করতে হয়।

আপনি শুরু করার আগে

নিশ্চিত করুন যে আপনি আপনার অ্যাপ সেটআপ করেছেন এবং Get Started গাইডে কভার করা ডেটাবেস অ্যাক্সেস করতে পারেন।

ডেটা পুনরুদ্ধার করা হচ্ছে

Firebase ডেটা GetValue() তে একবার কল করে বা FirebaseDatabase রেফারেন্সে ValueListener সাথে সংযুক্ত করে পুনরুদ্ধার করা হয়। ডেটার প্রারম্ভিক অবস্থার জন্য একবার মান শ্রোতাকে ডাকা হয় এবং আবার যে কোনো সময় ডেটা পরিবর্তিত হয়।

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

ডাটাবেসে ডেটা লিখতে, আপনার DatabaseReference একটি উদাহরণ প্রয়োজন:

    // Get the root reference location of the database.
    firebase::database::DatabaseReference dbref = database->GetReference();

একবার ডেটা পড়ুন

আপনি একবার প্রদত্ত পাথে বিষয়বস্তুর একটি স্ট্যাটিক স্ন্যাপশট পড়তে GetValue() পদ্ধতি ব্যবহার করতে পারেন। টাস্কের ফলাফলে একটি স্ন্যাপশট থাকবে যেখানে শিশু ডেটা সহ সেই অবস্থানের সমস্ত ডেটা থাকবে৷ যদি কোন তথ্য না থাকে, স্ন্যাপশট ফেরত null হয়।

  firebase::Future<firebase::database::DataSnapshot> result =
    dbRef.GetReference("Leaders").GetValue();

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

  // In the game loop that polls for the result...

  if (result.status() != firebase::kFutureStatusPending) {
    if (result.status() != firebase::kFutureStatusComplete) {
      LogMessage("ERROR: GetValue() returned an invalid result.");
      // Handle the error...
    } else if (result.error() != firebase::database::kErrorNone) {
      LogMessage("ERROR: GetValue() returned error %d: %s", result.error(),
                 result.error_message());
      // Handle the error...
    } else {
      firebase::database::DataSnapshot snapshot = result.result();
      // Do something with the snapshot...
    }
  }

এটি কিছু মৌলিক ত্রুটি পরীক্ষা দেখায়, ত্রুটি পরীক্ষা করার বিষয়ে আরও তথ্যের জন্য ফায়ারবেস::ভবিষ্যত রেফারেন্স দেখুন এবং ফলাফল কখন প্রস্তুত তা নির্ধারণ করার উপায়।

ঘটনা শুনুন

আপনি ডেটার পরিবর্তনগুলিতে সদস্যতা নিতে শ্রোতাদের যোগ করতে পারেন:

ValueListener বেস ক্লাস

কলব্যাক সাধারণ ব্যবহার
OnValueChanged একটি পথের সম্পূর্ণ বিষয়বস্তুর পরিবর্তনের জন্য পড়ুন এবং শুনুন।

OnChildListener বেস ক্লাস

OnChildAdded আইটেমগুলির তালিকা পুনরুদ্ধার করুন বা আইটেমগুলির একটি তালিকায় সংযোজনের জন্য শুনুন। তালিকার পরিবর্তনগুলি নিরীক্ষণ করতে OnChildChanged এবং OnChildRemoved সাথে ব্যবহারের প্রস্তাবিত৷
OnChildChanged একটি তালিকার আইটেম পরিবর্তনের জন্য শুনুন. তালিকার পরিবর্তনগুলি নিরীক্ষণ করতে OnChildAdded এবং OnChildRemoved এর সাথে ব্যবহার করুন।
OnChildRemoved একটি তালিকা থেকে আইটেম মুছে ফেলার জন্য শুনুন. তালিকার পরিবর্তনগুলি নিরীক্ষণ করতে OnChildAdded এবং OnChildChanged সাথে ব্যবহার করুন।
OnChildMoved অর্ডার করা তালিকায় আইটেমের ক্রম পরিবর্তনের জন্য শুনুন। আইটেমের অর্ডার পরিবর্তনের কারণে OnChildMoved কলব্যাক সবসময় OnChildChanged কলব্যাক অনুসরণ করে (আপনার বর্তমান অর্ডার পদ্ধতির উপর ভিত্তি করে)।

ভ্যালুলিসনার ক্লাস

আপনি একটি প্রদত্ত পাথে বিষয়বস্তু পরিবর্তনের সদস্যতা নিতে OnValueChanged কলব্যাক ব্যবহার করতে পারেন। এই কলব্যাকটি একবার ট্রিগার হয় যখন শ্রোতা সংযুক্ত থাকে এবং আবার প্রতিবার শিশু সহ ডেটা পরিবর্তিত হয়। কলব্যাক একটি স্ন্যাপশট পাস করা হয় যাতে শিশু ডেটা সহ সেই অবস্থানের সমস্ত ডেটা রয়েছে৷ যদি কোন তথ্য না থাকে, স্ন্যাপশট ফেরত null হয়।

নিম্নলিখিত উদাহরণটি ডাটাবেস থেকে লিডারবোর্ডের স্কোর পুনরুদ্ধার করে এমন একটি গেম প্রদর্শন করে:

  class LeadersValueListener : public firebase::database::ValueListener {
   public:
    void OnValueChanged(
        const firebase::database::DataSnapshot& snapshot) override {
      // Do something with the data in snapshot...
    }
    void OnCancelled(const firebase::database::Error& error_code,
                     const char* error_message) override {
      LogMessage("ERROR: LeadersValueListener canceled: %d: %s", error_code,
                 error_message);
    }
  };

  // Elsewhere in the code...

  LeadersValueListener* listener = new LeadersValueListener();
  firebase::Future<firebase::database::DataSnapshot> result =
    dbRef.GetReference("Leaders").AddValueListener(listener);

Future&ltDataSnapshot&gt ফলাফলে ইভেন্টের সময় ডাটাবেসের নির্দিষ্ট স্থানে ডেটা থাকে। একটি স্ন্যাপশটে কলিং value() ডেটা প্রতিনিধিত্বকারী একটি Variant প্রদান করে।

এই উদাহরণে, পড়া বাতিল করা হয়েছে কিনা তা দেখতে OnCancelled পদ্ধতি ওভাররাইড করা হয়েছে। উদাহরণস্বরূপ, যদি ক্লায়েন্টের ফায়ারবেস ডাটাবেস অবস্থান থেকে পড়ার অনুমতি না থাকে তবে একটি রিড বাতিল করা যেতে পারে। database::Error নির্দেশ করবে কেন ব্যর্থতা ঘটেছে।

চাইল্ড লিসনার ক্লাস

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

  class SessionCommentsChildListener : public firebase::database::ChildListener {
   public:
    void OnChildAdded(const firebase::database::DataSnapshot& snapshot,
                      const char* previous_sibling) override {
      // Do something with the data in snapshot ...
    }
    void OnChildChanged(const firebase::database::DataSnapshot& snapshot,
                        const char* previous_sibling) override {
      // Do something with the data in snapshot ...
    }
    void OnChildRemoved(
        const firebase::database::DataSnapshot& snapshot) override {
      // Do something with the data in snapshot ...
    }
    void OnChildMoved(const firebase::database::DataSnapshot& snapshot,
                      const char* previous_sibling) override {
      // Do something with the data in snapshot ...
    }
    void OnCancelled(const firebase::database::Error& error_code,
                     const char* error_message) override {
      LogMessage("ERROR: SessionCommentsChildListener canceled: %d: %s",
                 error_code, error_message);
    }
  };

  // elsewhere ....

  SessionCommentsChildListener* listener = new SessionCommentsChildListener();
  firebase::Future<firebase::database::DataSnapshot> result =
    dbRef.GetReference("GameSessionComments").AddChildListener(listener);

OnChildAdded কলব্যাক সাধারণত ফায়ারবেস ডাটাবেসের আইটেমগুলির একটি তালিকা পুনরুদ্ধার করতে ব্যবহৃত হয়। OnChildAdded কলব্যাক প্রতিটি বিদ্যমান শিশুর জন্য একবার কল করা হয় এবং তারপরে প্রতিবার নির্দিষ্ট পথে একটি নতুন শিশু যোগ করা হয়। শ্রোতাকে নতুন সন্তানের ডেটা সম্বলিত একটি স্ন্যাপশট দেওয়া হয়।

যেকোনো সময় চাইল্ড নোড পরিবর্তন করা হলে OnChildChanged কলব্যাক বলা হয়। এর মধ্যে চাইল্ড নোডের বংশধরদের যেকোনো পরিবর্তন অন্তর্ভুক্ত রয়েছে। এটি সাধারণত OnChildAdded এবং OnChildRemoved কলগুলির সাথে আইটেমগুলির একটি তালিকায় পরিবর্তনের প্রতিক্রিয়া জানাতে ব্যবহৃত হয়। শ্রোতার কাছে পাঠানো স্ন্যাপশটে সন্তানের জন্য আপডেট করা ডেটা রয়েছে।

OnChildRemoved কলব্যাকটি ট্রিগার হয় যখন একটি অবিলম্বে শিশুকে সরিয়ে দেওয়া হয়। এটি সাধারণত OnChildAdded এবং OnChildChanged কলব্যাকের সাথে ব্যবহার করা হয়। কলব্যাকে পাঠানো স্ন্যাপশটে সরানো সন্তানের ডেটা রয়েছে।

OnChildMoved কলব্যাকটি ট্রিগার করা হয় যখনই OnChildChanged কল একটি আপডেট দ্বারা উত্থাপিত হয় যা সন্তানের পুনর্বিন্যাস ঘটায়। এটি OrderByChild বা OrderByValue দিয়ে অর্ডার করা ডেটার সাথে ব্যবহার করা হয়।

তথ্য বাছাই এবং ফিল্টারিং

কী, মান অনুসারে বা শিশুর মান অনুসারে বাছাই করা ডেটা পুনরুদ্ধার করতে আপনি Realtime Database Query ক্লাস ব্যবহার করতে পারেন। আপনি বাছাই করা ফলাফলকে নির্দিষ্ট সংখ্যক ফলাফল বা কী বা মানের পরিসরে ফিল্টার করতে পারেন।

তথ্য সাজান

বাছাই করা ডেটা পুনরুদ্ধার করতে, ফলাফলগুলি কীভাবে অর্ডার করা হয় তা নির্ধারণ করতে অর্ডার-বাই পদ্ধতিগুলির একটি নির্দিষ্ট করে শুরু করুন:

পদ্ধতি ব্যবহার
OrderByChild() একটি নির্দিষ্ট চাইল্ড কী-এর মান অনুসারে ক্রম ফলাফল।
OrderByKey() চাইল্ড কী দ্বারা ফলাফল অর্ডার করুন।
OrderByValue() সন্তানের মান অনুযায়ী ফলাফল ক্রম করুন।

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

নিচের উদাহরণটি দেখায় যে আপনি কীভাবে স্কোর অনুসারে অর্ডার করা স্কোর লিডারবোর্ডে সদস্যতা নিতে পারেন।

  firebase::database::Query query =
    dbRef.GetReference("Leaders").OrderByChild("score");

  // To get the resulting DataSnapshot either use query.GetValue() and poll the
  // future, or use query.AddValueListener() and register to handle the
  // OnValueChanged callback.

এটি একটি firebase::Query সংজ্ঞায়িত করে যেটি যখন একটি ভ্যালুলিস্টেনারের সাথে মিলিত হয় তখন প্রতিটি এন্ট্রির স্কোর অনুসারে ক্লায়েন্টকে ডাটাবেসের লিডারবোর্ডের সাথে সিঙ্ক্রোনাইজ করে। আপনি আপনার ডেটাবেস গঠনে দক্ষতার সাথে আপনার ডেটা গঠন সম্পর্কে আরও পড়তে পারেন।

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

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

ডেটা ফিল্টার করার জন্য, আপনি একটি ক্যোয়ারী তৈরি করার সময় একটি অর্ডার-বাই পদ্ধতির সাথে সীমা বা পরিসরের যে কোনো পদ্ধতি একত্রিত করতে পারেন।

পদ্ধতি ব্যবহার
LimitToFirst() ফলাফলের অর্ডার করা তালিকার শুরু থেকে আইটেমের সর্বাধিক সংখ্যা সেট করে।
LimitToLast() ফলাফলের অর্ডারকৃত তালিকার শেষ থেকে ফেরার জন্য আইটেমের সর্বাধিক সংখ্যা সেট করে।
StartAt() ক্রম অনুসারে নির্বাচিত পদ্ধতির উপর নির্ভর করে নির্দিষ্ট কী বা মানের চেয়ে বড় বা সমান আইটেমগুলি ফেরত দিন।
EndAt() ক্রম অনুসারে নির্বাচিত পদ্ধতির উপর নির্ভর করে নির্দিষ্ট কী বা মানের থেকে কম বা সমান আইটেমগুলি ফেরত দিন।
EqualTo() ক্রম অনুসারে নির্বাচিত পদ্ধতির উপর নির্ভর করে নির্দিষ্ট কী বা মানের সমান আইটেমগুলি ফেরত দিন।

অর্ডার-বাই পদ্ধতির বিপরীতে, আপনি একাধিক সীমা বা পরিসর ফাংশন একত্রিত করতে পারেন। উদাহরণ স্বরূপ, ফলাফলগুলিকে একটি নির্দিষ্ট মানের পরিসরে সীমাবদ্ধ করতে আপনি StartAt() এবং EndAt() পদ্ধতিগুলিকে একত্রিত করতে পারেন।

এমনকি যখন ক্যোয়ারীটির জন্য শুধুমাত্র একটি মিল থাকে, তখনও স্ন্যাপশটটি একটি তালিকা; এটা শুধু একটি আইটেম রয়েছে.

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

একটি প্রদত্ত কলব্যাকের জন্য সিঙ্ক করার জন্য সর্বাধিক সংখ্যক শিশু সেট করতে আপনি LimitToFirst() এবং LimitToLast() পদ্ধতিগুলি ব্যবহার করতে পারেন৷ উদাহরণ স্বরূপ, আপনি যদি LimitToFirst() ব্যবহার করেন 100 এর সীমা সেট করতে, আপনি প্রাথমিকভাবে শুধুমাত্র 100টি পর্যন্ত OnChildAdded কলব্যাক পাবেন। আপনার ফায়ারবেস ডাটাবেসে 100টিরও কম আইটেম সংরক্ষিত থাকলে, প্রতিটি আইটেমের জন্য একটি OnChildAdded কলব্যাক চালু হয়।

আইটেমগুলি পরিবর্তন হওয়ার সাথে সাথে, আপনি যে আইটেমগুলি ক্যোয়ারীটি প্রবেশ করেন তাদের জন্য OnChildAdded কলব্যাক এবং এটি থেকে বাদ পড়া আইটেমগুলির জন্য OnChildRemoved কলব্যাকগুলি পান যাতে মোট সংখ্যা 100-এ থাকে৷

উদাহরণস্বরূপ, নীচের কোডটি একটি লিডারবোর্ড থেকে শীর্ষ স্কোর প্রদান করে:

  firebase::database::Query query =
    dbRef.GetReference("Leaders").OrderByChild("score").LimitToLast(1);

  // To get the resulting DataSnapshot either use query.GetValue() and poll the
  // future, or use query.AddValueListener() and register to handle the
  // OnValueChanged callback.

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

আপনি StartAt() , EndAt() , এবং EqualTo() ব্যবহার করতে পারেন প্রশ্নগুলির জন্য নির্বিচারে শুরু, সমাপ্তি এবং সমতুলতা পয়েন্টগুলি বেছে নিতে। এটি ডেটা পেজিনেট করার জন্য বা শিশুদের সাথে আইটেম খুঁজে বের করার জন্য দরকারী হতে পারে যেগুলির একটি নির্দিষ্ট মান রয়েছে৷

কিভাবে কোয়েরি ডেটা অর্ডার করা হয়

এই বিভাগটি ব্যাখ্যা করে যে কিভাবে Query ক্লাসের প্রতিটি ক্রম অনুসারে পদ্ধতি দ্বারা ডেটা সাজানো হয়।

OrderByChild

OrderByChild() ব্যবহার করার সময়, নির্দিষ্ট চাইল্ড কী ধারণ করে এমন ডেটা নিম্নরূপ সাজানো হয়:

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

OrderByKey

আপনার ডেটা সাজানোর জন্য OrderByKey() ব্যবহার করার সময়, কী দ্বারা ডেটা ঊর্ধ্বমুখী ক্রমে ফেরত দেওয়া হয়।

  1. 32-বিট পূর্ণসংখ্যা হিসাবে পার্স করা যেতে পারে এমন একটি কী সহ বাচ্চারা প্রথমে আসে, আরোহী ক্রমে সাজানো হয়।
  2. একটি স্ট্রিং মান সহ বাচ্চারা তাদের কী হিসাবে পরবর্তী আসে, লেক্সিকোগ্রাফিকভাবে আরোহী ক্রমে সাজানো হয়।

OrderByValue

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

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