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

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

শুরু করার আগে

Realtime Database ব্যবহার করার আগে, আপনাকে যা করতে হবে:

  • আপনার Unity প্রোজেক্ট রেজিস্টার করুন এবং Firebase ব্যবহার করার জন্য এটি কনফিগার করুন।

    • আপনার Unity প্রোজেক্টে আগে থেকেই Firebase ব্যবহার করা হলে, সেটি আগে থেকেই Firebase-এর জন্য রেজিস্টার ও কনফিগার করা আছে।

    • আপনার কোনও Unity প্রোজেক্ট না থাকলে, আপনি একটি স্যাম্পেল অ্যাপ ডাউনলোড করতে পারবেন।

  • আপনার Unity প্রোজেক্টে Firebase Unity SDK (বিশেষ করে, FirebaseDatabase.unitypackage) যোগ করুন।

মনে রাখবেন, আপনার Unity প্রোজেক্টে Firebase যোগ করার জন্য Firebase কনসোল এবং আপনার খোলা Unity প্রোজেক্ট, দুটিতেই টাস্ক থাকে (যেমন, আপনি কনসোল থেকে Firebase কনফিগারেশন ফাইল ডাউনলোড করেন, তারপর সেগুলি আপনার Unity প্রোজেক্টে সরান)।

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

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

DatabaseReference পান

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

using Firebase;
using Firebase.Database;
using Firebase.Extensions.TaskExtension; // for ContinueWithOnMainThread

public class MyScript: MonoBehaviour {
  void Start() {
    // Get the root reference location of the database.
    DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference;
  }
}

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

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

    FirebaseDatabase.DefaultInstance
      .GetReference("Leaders")
      .GetValueAsync().ContinueWithOnMainThread(task =&gt {
        if (task.IsFaulted) {
          // Handle the error...
        }
        else if (task.IsCompleted) {
          DataSnapshot snapshot = task.Result;
          // Do something with snapshot...
        }
      });

ইভেন্ট শুনুন

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

ইভেন্ট সাধারণ ব্যবহার
ValueChanged কোনও পাথের সম্পূর্ণ কন্টেন্টে পরিবর্তন করা হলে তা পড়ে ও শোনে।
ChildAdded আইটেমের তালিকা ফিরিয়ে আনা বা আইটেমের তালিকায় নতুন কিছু যোগ করা হয়েছে কিনা তা শোনা। তালিকার পরিবর্তন মনিটর করতে ChildChanged এবং ChildRemoved-এর সাথে ব্যবহার করার সাজেশন দেওয়া হয়েছে।
ChildChanged তালিকায় থাকা আইটেমে পরিবর্তন করা হলে তা শোনে। তালিকার পরিবর্তন মনিটর করতে ChildAdded এবং ChildRemoved-এর সাথে ব্যবহার করুন।
ChildRemoved তালিকা থেকে আইটেম সরিয়ে দেওয়ার সময় শুনুন। তালিকার পরিবর্তন মনিটর করতে ChildAdded এবং ChildChanged-এর সাথে ব্যবহার করুন।
ChildMoved ক্রমানুসারে সাজানো তালিকায় আইটেমের ক্রম পরিবর্তন হলে তা শুনুন। ChildMoved ইভেন্ট সবসময় ChildChanged ইভেন্টকে অনুসরণ করে যার কারণে আইটেমের ক্রম পরিবর্তিত হয় (আপনার বর্তমান অর্ডার-বাই মেথডের ভিত্তিতে)।

ValueChanged ইভেন্ট

আপনি ValueChanged ইভেন্ট ব্যবহার করে নির্দিষ্ট পাথে কন্টেন্টের পরিবর্তন সাবস্ক্রাইব করতে পারবেন। This event is triggered once when the listener is attached and again every time the data, including children, changes. ইভেন্ট কলব্যাক একটি স্ন্যাপশট পাস করে যাতে চাইল্ড ডেটা সহ সেই লোকেশনের সমস্ত ডেটা থাকে। কোনও ডেটা না থাকলে, স্ন্যাপশট null রিটার্ন করা হয়।

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

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders")
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

ValueChangedEventArgs-এ একটি DataSnapshot থাকে যাতে ইভেন্টের সময় ডেটাবেসের নির্দিষ্ট লোকেশনে ডেটা থাকে। স্ন্যাপশটে Value কল করলে ডেটা দেখানোর জন্য Dictionary<string, object> রিটার্ন করে। লোকেশনটিতে কোনও ডেটা না থাকলে, Value কল করলে null রিটার্ন করে।

এই উদাহরণে, args.DatabaseError-এর ক্ষেত্রেও পরীক্ষা করে দেখা হয় যে রিড বাতিল করা হয়েছে কিনা। যেমন, ক্লায়েন্টের কাছে Firebase ডেটাবেস লোকেশন থেকে পড়ার অনুমতি না থাকলে, পড়ার অনুরোধ বাতিল করা হতে পারে। DatabaseError থেকে জানা যাবে যে কেন ব্যর্থ হয়েছে।

আপনি পরে একই পাথ আছে এমন যেকোনও DatabaseReference ব্যবহার করে ইভেন্ট থেকে আনসাবস্ক্রাইব করতে পারবেন। DatabaseReference ইনস্ট্যান্স ক্ষণস্থায়ী এবং যেকোনও পাথ ও কোয়েরি অ্যাক্সেস করার একটি উপায় হিসাবে ভাবা যেতে পারে।

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders")
        .ValueChanged -= HandleValueChanged; // unsubscribe from ValueChanged.
    }

চাইল্ড ইভেন্ট

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

      var ref = FirebaseDatabase.DefaultInstance
      .GetReference("GameSessionComments");

      ref.ChildAdded += HandleChildAdded;
      ref.ChildChanged += HandleChildChanged;
      ref.ChildRemoved += HandleChildRemoved;
      ref.ChildMoved += HandleChildMoved;
    }

    void HandleChildAdded(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildChanged(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildRemoved(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildMoved(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

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

চাইল্ড নোড পরিবর্তন করা হলে, যেকোনও সময় ChildChanged ইভেন্টটি উত্থাপিত হয়। এর মধ্যে চাইল্ড নোডের ডিসেন্ডেন্টে করা যেকোনও পরিবর্তন অন্তর্ভুক্ত। এটি সাধারণত ChildAdded এবং ChildRemoved ইভেন্টের সাথে একযোগে ব্যবহার করা হয় যাতে আইটেমের তালিকায় পরিবর্তন করা যায়। ইভেন্ট লিসেনারে পাস করা স্ন্যাপশটে বাচ্চার জন্য আপডেট করা ডেটা থাকে।

ChildRemoved ইভেন্টটি ট্রিগার হয় যখন একটি ইমিডিয়েট চাইল্ড সরানো হয়। এটি সাধারণত ChildAdded এবং ChildChanged কলব্যাকের সাথে একত্রে ব্যবহার করা হয়। ইভেন্ট কলব্যাকে পাস করা স্ন্যাপশটে সরানো চাইল্ডের ডেটা থাকে।

ChildMoved ইভেন্টটি তখনই ট্রিগার হয় যখন ChildChanged ইভেন্টটি এমন একটি আপডেটের মাধ্যমে উত্থাপিত হয় যা চাইল্ডের রিঅর্ডারিং ঘটায়। এটি OrderByChild বা OrderByValue-এর মাধ্যমে অর্ডার করা ডেটার সাথে ব্যবহার করা হয়।

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

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

ডেটা সাজান

সাজানো ডেটা ফিরিয়ে আনতে, ফলাফল কীভাবে সাজানো হবে তা নির্ধারণ করতে অর্ডার-বাই মেথডের মধ্যে একটি নির্দিষ্ট করে শুরু করুন:

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

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

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

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders").OrderByChild("score")
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

এটি একটি কোয়েরি নির্ধারণ করে যা valuechanged ইভেন্ট লিসনারের সাথে যুক্ত হয়ে ডেটাবেসে লিডারবোর্ডের সাথে ক্লায়েন্টকে সিঙ্ক করে, প্রতিটি এন্ট্রির স্কোর অনুযায়ী ক্রমবিন্যাস করা হয়। আপনার ডেটাবেস স্ট্রাকচার করুন লিঙ্কে গিয়ে আপনার ডেটা দক্ষতার সাথে স্ট্রাকচার করার ব্যাপারে আরও পড়তে পারেন।

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

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

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

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

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

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

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

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

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

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

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders").OrderByChild("score").LimitToLast(1)
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

'কী' বা ভ্যালু অনুযায়ী ফিল্টার করুন

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

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

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

OrderByChild

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

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

OrderByKey

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

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

OrderByValue

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