डेटा सेव करें

शुरू करने से पहले

इस्तेमाल करने से पहले रीयलटाइम डेटाबेस, आपको ये काम करने होंगे:

  • अपना Unity प्रोजेक्ट रजिस्टर करें और इसे Firebase का इस्तेमाल करने के लिए कॉन्फ़िगर करें.

    • अगर आपके यूनिटी प्रोजेक्ट में पहले से ही Firebase का इस्तेमाल किया जा रहा है, तो इसका मतलब है कि Firebase के लिए रजिस्टर और कॉन्फ़िगर किया गया है.

    • अगर आपके पास Unity प्रोजेक्ट नहीं है, तो ऐप्लिकेशन का नमूना.

  • Firebase Unity SDK (खास तौर पर, FirebaseDatabase.unitypackage) को आपका Unity प्रोजेक्ट भी सही है.

ध्यान दें कि Firebase को अपने यूनिटी प्रोजेक्ट में जोड़ने पर, Firebase कंसोल और आपके खुले हुए Unity प्रोजेक्ट में उदाहरण के लिए, कंसोल से Firebase कॉन्फ़िगरेशन फ़ाइलें डाउनलोड करें. इसके बाद, उन्हें आपके Unity प्रोजेक्ट में शामिल किया जाएगा.

डेटा सहेजा जा रहा है

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 पाएं

डेटाबेस में डेटा लिखने के लिए, आपको 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>

अगर टाइप किए गए C# ऑब्जेक्ट का इस्तेमाल किया जाता है, तो बिल्ट-इन JsonUtility.ToJson() का इस्तेमाल किया जा सकता है का इस्तेमाल करें और 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() तरीके का इस्तेमाल करें. Push() तरीका, हर बार नई कुंजी जनरेट करता है चाइल्ड को तय किए गए Firebase रेफ़रंस में जोड़ दिया जाता है. इनका इस्तेमाल करके सूची के हर नए एलिमेंट के लिए अपने-आप जनरेट होने वाली कुंजियों का इस्तेमाल करके, कई क्लाइंट बच्चों को एक ही समय पर एक ही जगह पर जोड़ दें. इससे, उन्हें लिखने में परेशानी नहीं होगी. कॉन्टेंट बनाने Push() से जनरेट की गई यूनीक कुंजी, टाइमस्टैंप पर आधारित है. इसलिए, सूची के आइटम वह समय के हिसाब से अपने-आप ऑर्डर हो जाएगा.

पाने के लिए, Push() तरीके से मिले नए डेटा के रेफ़रंस का इस्तेमाल किया जा सकता है या बच्चे के लिए अपने-आप जनरेट हुई कुंजी की वैल्यू सेट करें. कॉल से जुड़ी सुविधा Push() संदर्भ पर Key की अपने-आप जनरेट होती है.

खास फ़ील्ड अपडेट करें

अन्य को ओवरराइट किए बिना नोड के खास चिल्ड्रेन को एक साथ लिखने के लिए चाइल्ड नोड के लिए, 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() की मदद से एक ही एपीआई में एक से ज़्यादा चिल्ड्रेन की जानकारी मिटाई जा सकती है कॉल.

जानें कि आपका डेटा कब अपलोड किया जाता है.

आपका डेटा, Firebase रीयल टाइम डेटाबेस सर्वर से कब जुड़ा होता है, यह जानने के लिए आपको निरंतरता जोड़ सकते हैं. SetValueAsync() और UpdateChildrenAsync(), दोनों एक Task वापस करें, जिससे आपको काम पूरा होने पर जानकारी मिले. अगर कॉल किसी भी कारण से असफल होता है, तो Tasks 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 डेटाबेस से जुड़े हर क्लाइंट का अपना इंटरनल वर्शन होता है सक्रिय डेटा का एक उदाहरण है. जब डेटा लिखा जाता है, तो वह इस लोकल वर्शन में लिखा जाता है चुनें. इसके बाद, Firebase क्लाइंट उस डेटा को रिमोट डेटाबेस के साथ सिंक करता है सर्वर और अन्य क्लाइंट के साथ "बेहतरीन कोशिश" करने पर आधार पर.

इस वजह से, डेटाबेस में मौजूद सभी कॉलम, लोकल इवेंट को ट्रिगर करते हैं किसी भी तरह का डेटा सर्वर पर सेव किया जाता है. इसका मतलब है कि आपका ऐप्लिकेशन फिर चाहे वह नेटवर्क में लगने वाले समय या कनेक्टिविटी की परवाह किए बिना रिस्पॉन्सिव हो.

कनेक्टिविटी वापस आने के बाद, आपके ऐप्लिकेशन को ज़रूरत के मुताबिक इवेंट दिखाए जाते हैं, ताकि क्लाइंट बिना किसी परेशानी के सर्वर की मौजूदा स्थिति के साथ सिंक हो जाए कोई कस्टम कोड लिखें.

अगले चरण