C++-এর জন্য Firebase Realtime Database-এর মাধ্যমে ডেটা ফিরিয়ে আনা

এই ডকুমেন্ট থেকে ডেটা ফিরিয়ে আনা এবং Firebase ডেটা কীভাবে সাজানো ও ফিল্টার করা যায় সেই সম্পর্কে প্রাথমিক ধারণা পাওয়া যায়।

শুরু করার আগে

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

ডেটা ফিরিয়ে আনা হচ্ছে

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

DatabaseReference পান

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

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

একবার ডেটা দেখা

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

  firebase::Future&ltfirebase::database::DataSnapshot&gt result =
    dbRef.GetReference("Leaders").GetValue();

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

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

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

ইভেন্ট শুনুন

ডেটাতে পরিবর্তন সাবস্ক্রাইব করার জন্য আপনি লিসেনার যোগ করতে পারবেন:

ValueListener মূল ক্লাস

কলব্যাক সাধারণ ব্যবহার
OnValueChanged কোনও পাথের সম্পূর্ণ কন্টেন্টে পরিবর্তন করা হলে তা পড়ে ও শোনে।

OnChildListener মূল ক্লাস

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

ValueListener ক্লাস

আপনি 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&ltfirebase::database::DataSnapshot&gt result =
    dbRef.GetReference("Leaders").AddValueListener(listener);

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

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

ChildListener ক্লাস

কোনও নোডের চাইল্ডে হওয়া নির্দিষ্ট অপারেশনের উত্তরে চাইল্ড ইভেন্ট ট্রিগার হয়, যেমন 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&ltfirebase::database::DataSnapshot&gt result =
    dbRef.GetReference("GameSessionComments").AddChildListener(listener);

OnChildAdded কলব্যাক সাধারণত Firebase ডেটাবেসে আইটেমের তালিকা উদ্ধার করতে ব্যবহার করা হয়। আগে থেকে থাকা প্রতিটি চাইল্ডের জন্য একবার 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 সংজ্ঞায়িত করে যা ValueListener-এর সাথে একত্রিত হলে, প্রতিটি এন্ট্রির স্কোর অনুসারে সাজানো ডেটাবেসে লিডারবোর্ডের সাথে ক্লায়েন্টকে সিঙ্ক করে। আপনি আপনার ডেটাবেস স্ট্রাকচার করুন লিঙ্কে গিয়ে আপনার ডেটা দক্ষতার সাথে স্ট্রাকচার করার ব্যাপারে আরও পড়তে পারেন।

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

ডেটা ফিল্টার করা হচ্ছে

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

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

অর্ডার-বাই মেথডের মতো নয়, আপনি একাধিক সীমা বা রেঞ্জ ফাংশন একত্রিত করতে পারবেন। যেমন, আপনি StartAt() এবং EndAt() পদ্ধতি একসাথে ব্যবহার করে ফলাফলকে নির্দিষ্ট রেঞ্জের মধ্যে সীমাবদ্ধ করতে পারেন।

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

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

আপনি LimitToFirst() এবং LimitToLast() পদ্ধতি ব্যবহার করে কোনও নির্দিষ্ট কলব্যাকের জন্য সিঙ্ক করা হবে এমন বাচ্চাদের সর্বাধিক সংখ্যা সেট করতে পারেন। যেমন, আপনি যদি LimitToFirst() ব্যবহার করে ১০০-এর সীমা সেট করেন, তাহলে প্রাথমিকভাবে আপনি সর্বাধিক ১০০টি OnChildAdded কলব্যাক পাবেন। আপনার Firebase ডেটাবেসে ১০০টির কম আইটেম স্টোর করা থাকলে, প্রতিটি আইটেমের জন্য একটি OnChildAdded কলব্যাক ফায়ার হয়।

আইটেম পরিবর্তন হওয়ার সাথে সাথে, আপনি কোয়েরিতে প্রবেশ করা আইটেমের জন্য OnChildAddedটি কলব্যাক এবং কোয়েরি থেকে বাদ পড়া আইটেমের জন্য OnChildRemovedটি কলব্যাক পাবেন যাতে মোট সংখ্যা ১০০ থাকে।

যেমন, নিচের কোডটি লিডারবোর্ড থেকে সেরা স্কোর দেখায়:

  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. যেসব চিলড্রেনকে ৩২-বিট ইন্টিজার হিসেবে পার্স করা যায়, সেগুলি প্রথমে আসে এবং ছোট থেকে বড় হিসেবে সাজানো হয়।
  2. এরপরে, স্ট্রিং ভ্যালু কী হিসেবে আছে এমন চাইল্ড আসে, যা লেক্সিকোগ্রাফিক্যালি ছোট থেকে বড় ক্রমানুসারে সাজানো থাকে।

OrderByValue

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

পরবর্তী ধাপ