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

এই ডকুমেন্ট থেকে ডেটা ফিরিয়ে আনা এবং 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 ইভেন্ট ব্যবহার করে নির্দিষ্ট পাথে কন্টেন্টের পরিবর্তন সাবস্ক্রাইব করতে পারবেন। এই ইভেন্টটি একবার ট্রিগার হয় যখন লিসেনার অ্যাটাচ করা হয় এবং আবার প্রতিবার ডেটা, চিলড্রেন সহ, পরিবর্তন হয়। ইভেন্ট কলব্যাক একটি স্ন্যাপশট পাস করে যাতে চাইল্ড ডেটা সহ সেই লোকেশনের সমস্ত ডেটা থাকে। কোনও ডেটা না থাকলে, স্ন্যাপশট 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()-এর মতোই, তবে নির্দিষ্ট চাইল্ড কী-এর মানের পরিবর্তে নোডের মান ব্যবহার করা হয়।