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

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

শুরু করার আগে

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

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

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

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

  • আপনার ইউনিটি প্রজেক্টে Firebase Unity SDK (বিশেষ করে, 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 একটি ক্রমানুসার তালিকার আইটেমের ক্রম পরিবর্তনের জন্য মনোযোগ দিন। 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 পরীক্ষা করে দেখা হয় যে পঠন বাতিল করা হয়েছে কিনা। উদাহরণস্বরূপ, যদি ক্লায়েন্টের 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 কলব্যাকের সাথে ব্যবহার করা হয়। ইভেন্ট কলব্যাকে পাঠানো স্ন্যাপশটে সরানো শিশুটির ডেটা থাকে।

যখনই ChildChanged ইভেন্টটি এমন কোনও আপডেটের মাধ্যমে উত্থাপিত হয় যার ফলে শিশুটির পুনঃক্রম তৈরি হয়, তখন ChildMoved ইভেন্টটি ট্রিগার হয়। এটি 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
    }

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

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. নির্দিষ্ট child key-এর জন্য true মান সম্পন্ন শিশুদের পরে আসে। যদি একাধিক শিশুদের true মান থাকে, তাহলে তাদের অভিধানিকভাবে key অনুসারে সাজানো হয়।
  4. সংখ্যাসূচক মান সম্পন্ন শিশুরা পরবর্তীতে আসে, ঊর্ধ্বক্রমানুসারে সাজানো। যদি একাধিক শিশু নির্দিষ্ট শিশু নোডের জন্য একই সংখ্যাসূচক মান ধারণ করে, তাহলে তাদের কী অনুসারে সাজানো হয়।
  5. স্ট্রিংগুলি সংখ্যার পরে আসে এবং লেক্সিকোগ্রাফিকভাবে ঊর্ধ্বক্রমানুসারে সাজানো হয়। যদি একাধিক চাইল্ড নোডের জন্য একই মান থাকে, তাহলে সেগুলিকে কী দ্বারা লেক্সিকোগ্রাফিকভাবে সাজানো হয়।
  6. বস্তুগুলি শেষে আসে এবং শব্দকোষ অনুসারে কী অনুসারে ঊর্ধ্বক্রমানুসারে সাজানো হয়।

OrderByKey

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

  1. ৩২-বিট পূর্ণসংখ্যা হিসেবে পার্স করা যায় এমন কী সহ শিশুদের প্রথমে আসে, আরোহী ক্রমে সাজানো হয়।
  2. যেসব শিশুদের কী হিসেবে স্ট্রিং মান থাকে, তারা পরবর্তীতে আসে, লেক্সিকোগ্রাফিকভাবে ঊর্ধ্বক্রমানুসারে সাজানো হয়।

OrderByValue

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