এই ডকুমেন্টে ডেটা রিট্রিভ করা এবং 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<firebase::database::DataSnapshot> 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<firebase::database::DataSnapshot> result = dbRef.GetReference("Leaders").AddValueListener(listener);
Future<DataSnapshot> ফলাফলে ইভেন্টের সময় ডেটাবেসে নির্দিষ্ট লোকেশনে থাকা ডেটা
থাকে। স্ন্যাপশটে value() কল করলে
ডেটা দেখানোর জন্য Variant রিটার্ন করে।
এই উদাহরণে, read
বাতিল করা হয়েছে কিনা তা দেখতে 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<firebase::database::DataSnapshot> result = dbRef.GetReference("GameSessionComments").AddChildListener(listener);
Firebase ডেটাবেসে আইটেমের তালিকা
রিট্রিভ করতে সাধারণত OnChildAdded কলব্যাক ব্যবহার করা হয়। আগে থেকে থাকা প্রতিটি সন্তানের জন্য OnChildAdded কলব্যাক একবার করে কল করা হয়
এবং তারপরে নির্দিষ্ট পাথে
নতুন সন্তান যোগ করা হলে আবার কল করা হয়। লিসনারকে নতুন চাইল্ডের
ডেটা সহ একটি স্ন্যাপশট পাস করা হয়।
চাইল্ড নোড পরিবর্তন করা হলে যেকোনও সময় OnChildChanged কলব্যাক কল করা হয়।
এর মধ্যে চাইল্ড নোডের ডিসেন্ডেন্টদের মধ্যে করা যেকোনও পরিবর্তন অন্তর্ভুক্ত। এটি সাধারণত
OnChildAdded এবং OnChildRemoved
কলের সাথে একসাথে ব্যবহার করা হয়, যাতে আইটেমের তালিকায় হওয়া পরিবর্তনের উত্তর দেওয়া যায়।
লিসনারকে পাঠানো স্ন্যাপশটে চাইল্ডের জন্য আপডেট করা ডেটা থাকে।
কোনও ইমিডিয়েট চাইল্ডকে সরিয়ে দিলে OnChildRemoved কলব্যাক ট্রিগার হয়।
এটি সাধারণত OnChildAdded এবং
OnChildChanged কলব্যাকের সাথে একসাথে ব্যবহার করা হয়। কলব্যাকে পাস করা স্ন্যাপশটে
সরানো চাইল্ডের ডেটা থাকে।
OnChildMoved কলব্যাক তখনই ট্রিগার করা হয় যখন OnChildChanged
কোনও আপডেট চাইল্ডের ক্রম পরিবর্তন করে। এটি OrderByChild বা OrderByValue-এর সাথে সাজানো ডেটার সাথে
ব্যবহার করা হয়।
ডেটা সাজানো ও ফিল্টার করা
আপনি Realtime Database Query ক্লাস ব্যবহার করে কী, ভ্যালু বা চাইল্ডের ভ্যালু অনুসারে সাজানো ডেটা
রিট্রিভ করতে পারবেন। এছাড়াও, আপনি সাজানো ফলাফলকে নির্দিষ্ট সংখ্যক ফলাফল বা কী বা
ভ্যালুর রেঞ্জে ফিল্টার করতে পারবেন।
ডেটা সাজানো
সর্ট করা ডেটা রিট্রিভ করতে, ফলাফল কীভাবে সাজানো হবে তা নির্ধারণ করতে অর্ডার-বাই পদ্ধতির মধ্যে একটি নির্দিষ্ট করে শুরু করুন:
| পদ্ধতি | ব্যবহার |
|---|---|
OrderByChild() |
নির্দিষ্ট চাইল্ড কী-এর ভ্যালু অনুযায়ী ফলাফল অর্ডার করুন। |
OrderByKey()
| চাইল্ড কী অনুযায়ী ফলাফল সাজান। |
OrderByValue() |
চাইল্ড ভ্যালু অনুযায়ী ফলাফল সাজান। |
আপনি একবারে শুধুমাত্র একটি অর্ডার-বাই পদ্ধতি ব্যবহার করতে পারবেন। একই কোয়েরিতে একাধিকবার order-by মেথড কল করলে সমস্যা হয়।
নিচের উদাহরণে দেখানো হয়েছে যে কীভাবে আপনি স্কোর অনুসারে সাজানো লিডারবোর্ডে সাবস্ক্রাইব করতে পারেন।
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 নির্ধারণ করে যা a
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() ব্যবহার করার সময়, নির্দিষ্ট চাইল্ড কী থাকা ডেটা
নিম্নলিখিত ক্রমে সাজানো হয়:
- নির্দিষ্ট চাইল্ড কী-এর জন্য
nullভ্যালু সহ বাচ্চারা প্রথমে আসে। - নির্দিষ্ট চাইল্ড কী-এর জন্য
falseভ্যালু সহ বাচ্চারা এর পরে আসবে। একাধিক সন্তানের ভ্যালুfalseহলে, তাদের কী অনুযায়ী আক্ষরিকভাবে সাজানো হয়। - নির্দিষ্ট চাইল্ড কী-এর জন্য
trueভ্যালু সহ বাচ্চারা এর পরে আসবে। একাধিক চাইল্ডের ভ্যালুtrueহলে, সেগুলিকে কী অনুযায়ী লেক্সিকোগ্রাফিক অর্ডারে সাজানো হয়। - এর পরে সংখ্যাসূচক মান সহ নামগুলি ছোট থেকে বড় ক্রমানুসারে সাজানো হয়। যদি নির্দিষ্ট চাইল্ড নোডের জন্য একাধিক চাইল্ডের একই সংখ্যাসূচক ভ্যালু থাকে, তাহলে সেগুলি কী অনুসারে সাজানো হয়।
- স্ট্রিং, সংখ্যার পরে আসে এবং ছোট থেকে বড় ক্রমানুসারে লেক্সিকোগ্রাফিক্যালি সাজানো থাকে। একাধিক সন্তানের জন্য নির্দিষ্ট করা child নোডের ভ্যালু একই হলে, সেগুলি কী অনুযায়ী লেক্সিকোগ্রাফিক ক্রমে সাজানো হয়।
- অবজেক্টগুলি শেষে আসে এবং কী অনুযায়ী ছোট থেকে বড় ক্রমানুসারে লেক্সিকোগ্রাফিক পদ্ধতিতে সাজানো হয়।
OrderByKey
আপনার ডেটা সাজাতে OrderByKey() ব্যবহার করার সময়, ডেটা কী অনুসারে
ক্রমবর্ধমান ক্রমে রিটার্ন করা হয়।
- যেসব বাচ্চার কী, ৩২-বিট পূর্ণসংখ্যা হিসেবে পার্স করা যায়, তাদের প্রথমে দেখানো হয় এবং ক্রমবর্ধমান ক্রমে সাজানো হয়।
- যেসব বাচ্চার কী হিসেবে স্ট্রিং ভ্যালু আছে, তাদের নাম এর পরে আসবে, অভিধান অনুযায়ী ছোট থেকে বড় ক্রমানুসারে সাজানো হবে।
OrderByValue
OrderByValue() ব্যবহার করার সময়, বাচ্চাদের তাদের ভ্যালু অনুযায়ী সাজানো হয়। OrderByChild()-এর মতো একই ক্রম
নির্ধারণের মাপকাঠি এখানেও প্রযোজ্য, তবে এখানে নির্দিষ্ট চাইল্ড কী-এর ভ্যালুর পরিবর্তে
নোডের ভ্যালু ব্যবহার করা হয়।