Verileri Kaydet

Başlamadan önce

Kullanmadan önce Gerçek Zamanlı Veritabanı, Yapmanız gerekenler:

  • 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) derleyip toparlarsınız.

ziyaret edin.

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'e 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 ekleme. 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() Tanımlanan yol için bazı anahtarları, bahsedeceğim.
RunTransaction() Eşzamanlı güncellemelerle bozulabilecek karmaşık verileri güncelleyin.

Veritabanı Referansı 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 SetValueAsync() kullanarak verileri bir bu yoldaki mevcut tüm verilerin yerine geçer. Bunu kullanabilirsiniz yöntemini kullanabilirsiniz:

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

Türü belirtilmiş bir C# nesnesi kullanıyorsanız yerleşik JsonUtility.ToJson() öğesini kullanabilirsiniz kullanarak SetRawJsonValueAsync() komutunu çağırın. Ö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, bir alt öğeyi tamamen yeniden yazmadan güncelleyebilirsiniz. Kullanıcılara izin vermek istiyorsanız kullanıcı adını aşağıdaki şekilde 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 düğümlerin üzerine yazmadan bir düğümün belirli alt öğelerine aynı anda yazmak için alt düğümler 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<string, Object> ToDictionary() {
        Dictionary<string, Object> result = new Dictionary<string, Object>();
        result["uid"] = uid;
        result["score"] = score;

        return result;
    }
}

Skor Tablosu girişi oluşturmak ve aynı anda en son skora güncellemek için feed'i ve kullanıcının kendi skor listesini görürseniz oyun, 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,RemoveValue() söz konusu verilerin konumu.

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 aktarıldığını öğ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 kaydet

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 verirsiniz. 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 => {
      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);
    });
}

Bir işlem kullanmak, birden fazla işlem varsa skor tablosunun yanlış olmasını önler Kullanıcı puanları aynı anda kaydeder ya da müşterinin verileri eskidir. Öğe işlem reddedilirse sunucu geçerli değeri istemciye döndürür. güncel değerle işlemi yeniden çalıştırır. Bu işlem, İşlem kabul edildi veya çok fazla deneme yapıldı.

Çevrimdışı veri yazma

İstemcinin ağ bağlantısı kesilirse uygulamanız çalışmaya devam eder sağlayabilir.

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. Bu, uygulamanızın hızlı bir şekilde yanıt verir.

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