তথ্য উদ্ধার করা হচ্ছে

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

শুরু করার আগে

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

  • আপনার ইউনিটি প্রজেক্টটি রেজিস্টার করুন এবং ফায়ারবেস ব্যবহারের জন্য কনফিগার করুন।

    • আপনার ইউনিটি প্রজেক্টে যদি আগে থেকেই ফায়ারবেস ব্যবহার করা হয়, তাহলে এটি ফায়ারবেসের জন্য ইতোমধ্যেই নিবন্ধিত এবং কনফিগার করা আছে।

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

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

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

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

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

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

ডাটাবেস থেকে ডেটা পড়ার জন্য, আপনার 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 একটি অর্ডারড লিস্টে আইটেমগুলোর ক্রমের পরিবর্তন লক্ষ্য করুন। যে ChildChanged ইভেন্টটি আইটেমের ক্রম পরিবর্তন করে (আপনার বর্তমান অর্ডার-বাই পদ্ধতির উপর ভিত্তি করে), ChildMoved ইভেন্টটি সর্বদা সেই ইভেন্টের পরেই ঘটে।

মান পরিবর্তনের ঘটনা

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

যখনই কোনো আপডেটের কারণে চাইল্ডের ক্রম পরিবর্তন হয় এবং তার ফলে ChildChanged ইভেন্টটি ট্রিগার হয়, তখন ChildMoved ইভেন্টটি ট্রিগার হয়। এটি সেইসব ডেটার ক্ষেত্রে ব্যবহৃত হয় যা OrderByChild বা OrderByValue ব্যবহার করে সাজানো থাকে।

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

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

ডেটা সাজান

সাজানো ডেটা পেতে, ফলাফল কীভাবে সাজানো হবে তা নির্ধারণ করতে প্রথমে order-by পদ্ধতিগুলোর মধ্যে একটি নির্দিষ্ট করুন:

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

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

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

      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
    }

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

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

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

কোয়েরি তৈরি করার সময় ডেটা ফিল্টার করতে আপনি limit বা range মেথডের যেকোনোটির সাথে order-by মেথড ব্যবহার করতে পারেন।

পদ্ধতি ব্যবহার
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 ক্লাসের প্রতিটি order-by মেথড ব্যবহার করে কীভাবে ডেটা সর্ট করা হয় তা ব্যাখ্যা করা হয়েছে।

OrderByChild

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

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

OrderByKey

OrderByKey() ব্যবহার করে ডেটা সর্ট করার সময়, ডেটা কী (key) অনুসারে আরোহী ক্রমে ফেরত আসে।

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

OrderByValue

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