Verileri Kaydet

Başlamadan önce

Realtime Database özelliğini kullanabilmeniz için:

  • Unity projenizi kaydedin ve Firebase'i kullanacak şekilde yapılandırın.

    • Unity projeniz zaten Firebase kullanıyorsa kaydedilip yapılandırıldı.

    • Unity projeniz yoksa şunu indirebilirsiniz: örnek uygulama.

  • Firebase Unity SDK'sını (özellikle FirebaseDatabase.unitypackage) şuraya ekleyin: derleyip toparlarsınız.

Firebase'i Unity projenize eklemenin hem Firebase konsolunda ve açık Unity projenizde (örneğin, Firebase yapılandırma dosyalarını konsoldan indirip bu dosyalara bunları Unity projenize ekleyin).

Verileri Kaydetme

Firebase Realtime Database cihazına veri yazmak için beş yöntem vardır:

Yöntem Yaygın kullanım alanları
SetValueAsync() Belirli bir yola veri yazma veya değiştirme (ör. users/<user-id>/<username>
SetRawJsonValueAsync() Verileri ham Json ile yazın veya değiştirin. Örneğin: users/<user-id>/<username>
Push() Veri listesine ekleyin. Her aradığınızda Push(), Firebase, ayrıca kullanılabilecek benzersiz bir anahtar oluşturur benzersiz bir tanımlayıcı olarak, user-scores/<user-id>/<unique-score-id>.
UpdateChildrenAsync() Verilerin tamamını değiştirmeden, tanımlanmış bir yolun anahtarlarından bazılarını güncelleyin.
RunTransaction() Eşzamanlı güncellemelerle bozulabilecek karmaşık verileri güncelleyin.

DatabaseReference alma

Veritabanı'na veri yazmak için DatabaseReference örneğinin olması gerekir:

using Firebase;
using Firebase.Database;

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

Bir referanstaki verileri yazma, güncelleme veya silme

Temel yazma işlemleri

Temel yazma işlemleri için, verileri belirtilen bir referansa kaydetmek ve bu yoldaki mevcut verileri değiştirmek üzere SetValueAsync()'ü kullanabilirsiniz. Mevcut JSON türlerine karşılık gelen türleri iletmek için bu yöntemi aşağıdaki gibi kullanabilirsiniz:

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

Türlendirilmiş bir C# nesnesi kullanıyorsanız nesneyi ham JSON'a dönüştürmek ve SetRawJsonValueAsync()'ı çağırmak için yerleşik JsonUtility.ToJson() işlevini kullanabilirsiniz. Örneğin, aşağıdaki gibi görünen bir Kullanıcı sınıfınız olabilir:

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

    public User() {
    }

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

SetRawJsonValueAsync() uygulamasına sahip bir kullanıcıyı aşağıdaki şekilde ekleyebilirsiniz:

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() veya SetRawJsonValueAsync() bu şekilde kullanılırsa verilerin üzerine yazılır belirtilen konumda (tüm alt düğümler dahil) yer alır. Ancak nesnenin tamamını yeniden yazmadan da alt nesneyi güncelleyebilirsiniz. Kullanıcıların profillerini güncellemelerine izin vermek istiyorsanız kullanıcı adını aşağıdaki gibi güncelleyebilirsiniz:

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

Veri listesine ekle

Çok kullanıcılı uygulamalarda bir listeye veri eklemek için Push() yöntemini kullanın. Push() yöntemi, yeni bir anahtar oluşturulmasını her seferinde benzersiz bir anahtar alt öğesi, belirtilen Firebase referansına eklenir. Bu araçları kullanarak her yeni öğe için otomatik olarak oluşturulan anahtarlara sahip olduğundan, bazı müşteriler yazma çakışmaları olmadan aynı anda aynı konuma alt öğe ekleme. İlgili içeriği oluşturmak için kullanılan Push() tarafından oluşturulan benzersiz anahtar bir zaman damgasına dayalı olduğundan liste öğeleri kronolojik olarak otomatik olarak sıralanır.

Aşağıdakileri almak için Push() yönteminin döndürdüğü yeni verilere referansı kullanabilirsiniz. alt yayıncının otomatik olarak oluşturduğu anahtarın değerini veya çocuk için veri ayarlayın. Telefon etme Push() referansındaki Key, otomatik olarak oluşturulan anahtardır.

Belirli alanları güncelle

Diğer alt düğümlerin üzerine yazmadan bir düğümün belirli alt düğümlerine aynı anda yazmak için UpdateChildrenAsync() yöntemini kullanın.

UpdateChildrenAsync() çağrısı yapılırken alt düzey alt değerleri şu şekilde güncelleyebilirsiniz: anahtar için bir yol belirterek. Veriler ölçeklendirilmek üzere birden fazla konumda depolanıyorsa isterseniz, bu verilerin tüm örneklerini verilerin yayılması. Örneğin, oyunda şunun gibi bir LeaderboardEntry sınıfı olabilir:

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&ltstring, Object&gt ToDictionary() {
        Dictionary&ltstring, Object&gt result = new Dictionary&ltstring, Object&gt();
        result["uid"] = uid;
        result["score"] = score;

        return result;
    }
}

Oyun, bir LeaderboardEntry oluşturmak ve bunu aynı anda son puan feed'ine ve kullanıcının kendi puan listesine güncellemek için aşağıdaki gibi bir kod kullanır:

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);
}

Bu örnekte, şuna ait girişleri içeren düğümde bir giriş oluşturmak için Push() kullanılmıştır: /scores/$key alanındaki tüm kullanıcıları ve anahtarı Key. Bu anahtar, kullanıcının iş sayfasında ikinci bir giriş oluşturmak için kullanılabilir. skor /user-scores/$userid/$key.

Bu yolları kullanarak, bir bölgedeki birden fazla konumda aynı anda güncelleme yapabilirsiniz. tek bir UpdateChildrenAsync() çağrısıyla JSON ağacını oluşturabilirsiniz (örneğin, örnek, her iki konumda da yeni girişi oluşturur. Eş zamanlı güncellemeler yapıldı ya tüm güncellemeler başarılı olur ya da başarısız olur.

Verileri silin

Verileri silmenin en basit yolu, söz konusu verilerin konumuna referans vererek RemoveValue() işlevini çağırmaktır.

Başka bir yazma işleminin değeri olarak null değerini belirterek de silebilirsiniz SetValueAsync() veya UpdateChildrenAsync() gibi bir işlem. Bunu kullanabilirsiniz tek bir API'de birden fazla alt öğeyi silmek için UpdateChildrenAsync() ile teknik çağrısına bir tıklama URL'si eklemeniz gerekir.

Verilerinizin kaydedildiği zamanı öğrenin.

Verilerinizin Firebase Realtime Database sunucusuna ne zaman kaydedildiğini öğrenmek için bir devamlılık ekleyebilirsiniz. Hem SetValueAsync() hem de UpdateChildrenAsync() işlemin tamamlandığını size bildiren bir Task döndürür. Öğe herhangi bir nedenle başarısız olursa Görevler IsFaulted Hatanın neden oluştuğunu belirten Exception özelliği.

Verileri işlem olarak kaydetme

Eşzamanlı etkenlere göre bozulabilecek verilerle çalışırken artımlı sayaçlar gibi değişiklikleri yapmak için işlemin işleyiş şekli. Bu işleme bir Func atarsınız. Bu güncelleme (Func) geçerli durumu alır bağımsız değişken olarak sunar ve istediğiniz yeni durumu döndürür. yazma. Başka bir istemci konuma yazarsa yeni değeriniz güncelleme fonksiyonunuz yeni geçerli kod değeri gösterilir ve yazma işlemi yeniden denenir.

Örneğin, bir oyunda kullanıcıların bir skor tablosunu en yüksek beş puan:

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

    leaderBoardRef.RunTransaction(mutableData =&gt {
      List&ltobject&gt leaders = mutableData.Value as List&ltobject>

      if (leaders == null) {
        leaders = new List&ltobject&gt();
      } else if (mutableData.ChildrenCount &gt= MaxScores) {
        long minScore = long.MaxValue;
        object minVal = null;
        foreach (var child in leaders) {
          if (!(child is Dictionary&ltstring, object&gt)) continue;
          long childScore = (long)
                      ((Dictionary&ltstring, object&gt)child)["score"];
          if (childScore &lt minScore) {
            minScore = childScore;
            minVal = child;
          }
        }
        if (minScore &gt 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&ltstring, object&gt newScoreMap =
                       new Dictionary&ltstring, object&gt();
      newScoreMap["score"] = score;
      newScoreMap["email"] = email;
      leaders.Add(newScoreMap);
      mutableData.Value = leaders;
      return TransactionResult.Success(mutableData);
    });
}

İşlem kullanmak, birden fazla kullanıcı aynı anda puan kaydediyorsa veya istemcide eski veriler varsa skor tablosunun yanlış olmasını önler. İşlem reddedilirse sunucu, mevcut değeri istemciye döndürür. İstemci de işlemi güncellenmiş değerle tekrar çalıştırır. Bu işlem, İşlem kabul edildi veya çok fazla deneme yapıldı.

Çevrimdışı veri yazma

Bir istemcinin ağ bağlantısı kesilirse uygulamanız düzgün çalışmaya devam eder.

Firebase veritabanına bağlı her istemcinin kendi dahili sürümü bulunur olabilir. Veriler yazıldığında, bu yerel sürüme yazılır. tıklayın. Firebase istemcisi bu verileri uzak veritabanı ile senkronize eder sağlamak için "en iyisini" yaparak .

Sonuç olarak, veritabanına yapılan tüm yazmalar yerel etkinlikleri hemen, sunucuya herhangi bir veri yazıldığından emin olabilirsiniz. Böylece uygulamanız, ağ gecikmesinden veya bağlantısından etkilenmeden yanıt vermeye devam eder.

Bağlantı yeniden kurulduğunda uygulamanız uygun veri kümesini alır Böylece istemcinin, istemcinin bunu gerçekleştirmesine gerek kalmadan mevcut sunucu durumuyla herhangi bir özel kod yazabilirsiniz.

Sonraki adımlar