Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

তথ্য সংরক্ষণ

তুমি শুরু করার আগে

আগে আপনি ব্যবহার করতে পারেন রিয়েলটাইম ডাটাবেস , আপনি প্রয়োজন:

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

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

    • আপনি যদি একটি ঐক্য প্রকল্প আছে না থাকে, তাহলে আপনি একটি বিনামূল্যে ডাউনলোড করতে পারেন নমুনা অ্যাপ্লিকেশন

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

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

ডেটা সেভ করা

ফায়ারবেস রিয়েলটাইম ডাটাবেসে ডেটা লেখার জন্য পাঁচটি পদ্ধতি রয়েছে:

পদ্ধতি সাধারণ ব্যবহার
SetValueAsync() লিখুন বা এই ধরনের একটি সংজ্ঞায়িত পথে ডেটা, প্রতিস্থাপন users/<user-id>/<username>
SetRawJsonValueAsync() লিখুন অথবা যেমন কাঁচা JSON সঙ্গে ডেটা, প্রতিস্থাপন users/<user-id>/<username>
Push() ডেটার তালিকায় যোগ করুন। প্রতিটি সময় আপনি কল Push() , Firebase যেমন একটি অনন্য কী যে একটি অনন্য শনাক্তকারী হিসেবে ব্যবহার করা যেতে পারে, উত্পন্ন user-scores/<user-id>/<unique-score-id>
UpdateChildrenAsync() সমস্ত ডেটা প্রতিস্থাপন না করে একটি সংজ্ঞায়িত পথের জন্য কিছু কী আপডেট করুন।
RunTransaction() জটিল ডেটা আপডেট করুন যা একযোগে আপডেট দ্বারা দূষিত হতে পারে।

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

ডাটাবেজ ডেটা লিখতে, আপনি একটি দৃষ্টান্ত প্রয়োজন DatabaseReference :

using Firebase;
using Firebase.Database;

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

একটি রেফারেন্সে ডেটা লিখুন, আপডেট করুন বা মুছে দিন

মৌলিক লেখার ক্রিয়াকলাপ

মৌলিক লেখার অপারেশন জন্য, আপনি ব্যবহার করতে পারেন SetValueAsync() একটি নির্দিষ্ট রেফারেন্স এ ডেটা সংরক্ষণ, যে পথ যে কোনো বিদ্যমান তথ্য প্রতিস্থাপন। আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন যেগুলি উপলব্ধ JSON প্রকারের সাথে মিল রয়েছে:

  • string
  • long
  • double
  • bool
  • Dictionary<string, Object>
  • List<Object>

আপনি যদি একটি টাইপ করা সি # টি বস্তু ব্যবহার করেন, তাহলে সালে নির্মিত ব্যবহার করতে পারেন JsonUtility.ToJson() কাঁচা JSON বস্তুর রূপান্তর এবং কল করতে SetRawJsonValueAsync() । উদাহরণস্বরূপ, আপনার একটি ব্যবহারকারী শ্রেণী থাকতে পারে যা দেখতে নিম্নরূপ:

public class User {
    public string username;
    public string email;

    public User() {
    }

    public User(string username, string email) {
        this.username = username;
        this.email = email;
    }
}

আপনার সাথে একটি ব্যবহারকারী যোগ করতে পারেন SetRawJsonValueAsync() নিম্নরূপ:

private void writeNewUser(string userId, string name, string email) {
    User user = new User(name, email);
    string json = JsonUtility.ToJson(user);

    mDatabaseRef.Child("users").Child(userId).SetRawJsonValueAsync(json);
}

ব্যবহার SetValueAsync() বা SetRawJsonValueAsync() নির্দিষ্ট অবস্থানে মুছে ফেলা হয় ডেটা এই ভাবে, কোনো শিশু নোড সহ। যাইহোক, আপনি এখনও পুরো বস্তুর পুনর্লিখন ছাড়াই একটি শিশুকে আপডেট করতে পারেন। আপনি যদি ব্যবহারকারীদের তাদের প্রোফাইল আপডেট করার অনুমতি দিতে চান তবে আপনি নিম্নরূপ ব্যবহারকারীর নাম আপডেট করতে পারেন:

mDatabaseRef.Child("users").Child(userId).Child("username").SetValueAsync(name);

ডেটার একটি তালিকা যুক্ত করুন

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

আপনি দ্বারা ফিরে নতুন তথ্য রেফারেন্স ব্যবহার করতে পারেন Push() সন্তানের জন্য সন্তানের স্বয়ংক্রিয়ভাবে তৈরি কী বা সেট ডেটার মান পেতে পদ্ধতি। কলিং Key একটি উপর Push() রেফারেন্স স্বয়ংক্রিয়ভাবে তৈরি কী মান ফেরায়।

নির্দিষ্ট ক্ষেত্র আপডেট করুন

একযোগে অন্যান্য শিশু নোড মুছে যাওয়ার ছাড়া একটি নোডের নির্দিষ্ট শিশুদের লিখতে, ব্যবহার UpdateChildrenAsync() পদ্ধতি।

যখন কলিং UpdateChildrenAsync() , আপনি কী-এর জন্য একটি পাথ নির্দিষ্ট করে নিম্ন পর্যায়ের শিশু মান আপডেট করতে পারেন। তথ্য একাধিক অবস্থান মধ্যে সংরক্ষিত হয় তাহলে ভাল আকার পরিবর্তন করতে, আপনি ব্যবহার যে ডেটা সমস্ত উদাহরণ আপডেট করতে পারেন তথ্য পাখা-আউট । উদাহরণস্বরূপ, একটি খেলা একটি থাকতে পারে LeaderboardEntry ভালো শ্রেণী:

public class LeaderboardEntry {
    public string uid;
    public int score = 0;

    public LeaderboardEntry() {
    }

    public LeaderboardEntry(string uid, int score) {
        this.uid = uid;
        this.score = score;
    }

    public Dictionary<string, Object> ToDictionary() {
        Dictionary<string, Object> result = new Dictionary<string, Object>();
        result["uid"] = uid;
        result["score"] = score;

        return result;
    }
}

লিডারবোর্ড এন্ট্রি তৈরি করতে এবং একই সাথে সাম্প্রতিক স্কোর ফিড এবং ব্যবহারকারীর নিজস্ব স্কোর তালিকায় আপডেট করার জন্য, গেমটি এইরকম কোড ব্যবহার করে:

private void WriteNewScore(string userId, int score) {
    // Create new entry at /user-scores/$userid/$scoreid and at
    // /leaderboard/$scoreid simultaneously
    string key = mDatabase.Child("scores").Push().Key;
    LeaderBoardEntry entry = new LeaderBoardEntry(userId, score);
    Dictionary<string, Object> entryValues = entry.ToDictionary();

    Dictionary<string, Object> childUpdates = new Dictionary<string, Object>();
    childUpdates["/scores/" + key] = entryValues;
    childUpdates["/user-scores/" + userId + "/" + key] = entryValues;

    mDatabase.UpdateChildrenAsync(childUpdates);
}

এই উদাহরণটিতে ব্যবহারসমূহ Push() এ সকল ব্যবহারকারীর জন্য এন্ট্রি ধারণকারী নোডের মধ্যে একটি এন্ট্রি তৈরি করতে /scores/$key এবং একই সঙ্গে কী পুনরুদ্ধার Key । কী তারপর ব্যবহারকারীর স্কোর একটি দ্বিতীয় এন্ট্রি তৈরি করতে ব্যবহার করা যেতে পারে /user-scores/$userid/$key

এই পাথ ব্যবহার করে, আপনি একটি একক কলের সাথে তাদেরকে JSON গাছ একাধিক অবস্থানে যুগপত আপডেট সম্পাদন করতে পারবেন UpdateChildrenAsync() যেমন কিভাবে এই উদাহরণে উভয় স্থানে নতুন এন্ট্রি তৈরি করে যেমন। এইভাবে করা যুগপত আপডেটগুলি পারমাণবিক: হয় সব আপডেট সফল হয় অথবা সব আপডেট ব্যর্থ হয়।

ডেটা মুছুন

ডিলিট ডেটাতে সহজ উপায় কল হয় RemoveValue() যে তথ্য অবস্থানে একটি রেফারেন্সে।

এছাড়াও আপনি নির্দিষ্ট করে মুছে দিতে পারেন null যেমন অন্য লেখ অপারেশন জন্য মান হিসাবে SetValueAsync() বা UpdateChildrenAsync() । আপনার সাথে এই কৌশল ব্যবহার করতে পারেন UpdateChildrenAsync() একটি একক API কল একাধিক শিশু মুছে দিন।

আপনার ডেটা প্রতিশ্রুতিবদ্ধ হলে জানুন।

আপনার ডেটা কখন ফায়ারবেস রিয়েলটাইম ডাটাবেস সার্ভারে প্রতিশ্রুতিবদ্ধ তা জানতে, আপনি একটি ধারাবাহিকতা যুক্ত করতে পারেন। উভয় SetValueAsync() এবং UpdateChildrenAsync() একটি ফিরতি Task যে আপনার যখন জানতে অপারেশন সম্পূর্ণ অনুমতি দেয়। কল কোনো কারণে অসফল হলে, কার্যগুলি IsFaulted সঙ্গে সত্য হতে হবে Exception সম্পত্তি ইঙ্গিত কেন ব্যর্থতা ঘটেছে।

লেনদেন হিসাবে ডেটা সংরক্ষণ করুন

যখন ডেটা আছে যা বৃদ্ধিজনিত কাউন্টারে যেমন সমবর্তী পরিবর্তন, দ্বারা ক্ষতিগ্রস্ত হতে পারে সঙ্গে কাজ, আপনি একটি ব্যবহার করতে পারেন লেনদেন অপারেশন । আপনি এই ক্রিয়াকলাপটি একটি দিতে Func । এই আপডেটের Func একটি আর্গুমেন্ট হিসাবে তথ্য বর্তমান অবস্থা নেয় এবং নতুন পছন্দসই রাষ্ট্র আপনি লিখতে চাই ফেরৎ। যদি আপনার নতুন মান সফলভাবে লেখার আগে অন্য ক্লায়েন্ট লোকেশনে লেখেন, আপনার আপডেট ফাংশনটিকে নতুন বর্তমান মান দিয়ে আবার বলা হয় এবং লেখাটি আবার চেষ্টা করা হয়।

উদাহরণস্বরূপ, একটি খেলায় আপনি ব্যবহারকারীদের পাঁচটি সর্বোচ্চ স্কোর সহ লিডারবোর্ড আপডেট করার অনুমতি দিতে পারেন:

private void AddScoreToLeaders(string email, 
                               long score,
                               DatabaseReference leaderBoardRef) {

    leaderBoardRef.RunTransaction(mutableData => {
      List<object> leaders = mutableData.Value as List<object>

      if (leaders == null) {
        leaders = new List<object>();
      } else if (mutableData.ChildrenCount >= MaxScores) {
        long minScore = long.MaxValue;
        object minVal = null;
        foreach (var child in leaders) {
          if (!(child is Dictionary<string, object>)) continue;
          long childScore = (long)
                      ((Dictionary<string, object>)child)["score"];
          if (childScore < minScore) {
            minScore = childScore;
            minVal = child;
          }
        }
        if (minScore > score) {
          // The new score is lower than the existing 5 scores, abort.
          return TransactionResult.Abort();
        }

        // Remove the lowest score.
        leaders.Remove(minVal);
      }

      // Add the new high score.
      Dictionary<string, object> newScoreMap =
                       new Dictionary<string, object>();
      newScoreMap["score"] = score;
      newScoreMap["email"] = email;
      leaders.Add(newScoreMap);
      mutableData.Value = leaders;
      return TransactionResult.Success(mutableData);
    });
}

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

অফলাইনে ডেটা লিখুন

যদি কোন ক্লায়েন্ট তার নেটওয়ার্ক সংযোগ হারিয়ে ফেলে, আপনার অ্যাপ সঠিকভাবে কাজ চালিয়ে যাবে।

একটি Firebase ডাটাবেসের সাথে সংযুক্ত প্রতিটি ক্লায়েন্ট যে কোন সক্রিয় ডেটার নিজস্ব অভ্যন্তরীণ সংস্করণ বজায় রাখে। যখন ডেটা লেখা হয়, এটি প্রথমে এই স্থানীয় সংস্করণে লেখা হয়। ফায়ারবেস ক্লায়েন্ট তখন রিমোট ডাটাবেস সার্ভার এবং অন্যান্য ক্লায়েন্টদের সাথে "সেরা-প্রচেষ্টা" ভিত্তিতে সেই ডেটা সিঙ্ক্রোনাইজ করে।

ফলস্বরূপ, সমস্ত ডাটাবেসে লিখতে থাকে স্থানীয় ইভেন্টগুলিকে অবিলম্বে ট্রিগার করে, কোন তথ্য সার্ভারে লেখার আগে। এর মানে হল যে আপনার অ্যাপটি নেটওয়ার্ক লেটেন্সি বা কানেক্টিভিটি নির্বিশেষে প্রতিক্রিয়াশীল থাকে।

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

পরবর্তী পদক্ষেপ