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

এই দস্তাবেজটি ডেটা পুনরুদ্ধারের মূল বিষয়গুলি কভার করে এবং কীভাবে Firebase ডেটা অর্ডার এবং ফিল্টার করতে হয়।

আপনি শুরু করার আগে

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

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

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

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

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

মনে রাখবেন যে আপনার ইউনিটি প্রোজেক্টে ফায়ারবেস যোগ করার জন্য Firebase কনসোল এবং আপনার ওপেন ইউনিটি প্রোজেক্ট উভয়েরই কাজ জড়িত থাকে (উদাহরণস্বরূপ, আপনি কনসোল থেকে 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 => {
        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 ইভেন্ট ব্যবহার করতে পারেন। এই ইভেন্টটি একবার ট্রিগার হয় যখন শ্রোতা সংযুক্ত থাকে এবং আবার প্রতিবার শিশু সহ ডেটা পরিবর্তিত হয়। ইভেন্ট কলব্যাক একটি স্ন্যাপশট পাস করা হয় যেখানে শিশু ডেটা সহ সেই অবস্থানের সমস্ত ডেটা রয়েছে৷ যদি কোন তথ্য না থাকে, স্ন্যাপশট ফেরত 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 ইভেন্টটি সাধারণত ফায়ারবেস ডাটাবেসের আইটেমগুলির একটি তালিকা পুনরুদ্ধার করতে ব্যবহৃত হয়। 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
    }

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

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

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

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

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

অর্ডার-বাই পদ্ধতির বিপরীতে, আপনি একাধিক সীমা বা পরিসর ফাংশন একত্রিত করতে পারেন। উদাহরণ স্বরূপ, ফলাফলগুলিকে একটি নির্দিষ্ট মানের পরিসরে সীমাবদ্ধ করতে আপনি StartAt() এবং EndAt() পদ্ধতিগুলিকে একত্রিত করতে পারেন।

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

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

একটি প্রদত্ত কলব্যাকের জন্য সিঙ্ক করার জন্য সর্বাধিক সংখ্যক শিশু সেট করতে আপনি LimitToFirst() এবং LimitToLast() পদ্ধতিগুলি ব্যবহার করতে পারেন৷ উদাহরণস্বরূপ, যদি আপনি LimitToFirst() ব্যবহার করেন 100 এর সীমা সেট করতে, আপনি প্রাথমিকভাবে শুধুমাত্র 100 টি ChildAdded কলব্যাক পাবেন। আপনার ফায়ারবেস ডাটাবেসে 100টিরও কম আইটেম সংরক্ষিত থাকলে, প্রতিটি আইটেমের জন্য একটি ChildAdded কলব্যাক চালু হয়।

আইটেমগুলি পরিবর্তন হওয়ার সাথে সাথে, আপনি যে আইটেমগুলি ক্যোয়ারী প্রবেশ করেন তার জন্য ChildAdded কলব্যাক এবং এটি থেকে বাদ পড়া আইটেমগুলির জন্য ChildRemoved কলব্যাকগুলি পান যাতে মোট সংখ্যা 100-এ থাকে৷

উদাহরণস্বরূপ, নীচের কোডটি একটি লিডারবোর্ড থেকে শীর্ষ স্কোর প্রদান করে:

      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. 32-বিট পূর্ণসংখ্যা হিসাবে পার্স করা যেতে পারে এমন একটি কী সহ বাচ্চারা প্রথমে আসে, আরোহী ক্রমে সাজানো হয়।
  2. একটি স্ট্রিং মান সহ বাচ্চারা তাদের কী হিসাবে পরবর্তী আসে, লেক্সিকোগ্রাফিকভাবে আরোহী ক্রমে সাজানো হয়।

OrderByValue

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