Veri kaydet

Sen başlamadan önce

Realtime Database'i kullanmadan önce yapmanız gerekenler:

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

    • Unity projeniz zaten Firebase kullanıyorsa Firebase için zaten kayıtlı ve yapılandırılmış demektir.

    • Bir Unity projeniz yoksa örnek bir uygulama indirebilirsiniz.

  • Firebase Unity SDK'sını (özellikle FirebaseDatabase.unitypackage ) Unity projenize ekleyin.

Unity projenize Firebase eklemenin hem Firebase konsolunda hem de açık Unity projenizde görevler içerdiğini unutmayın (örneğin, Firebase yapılandırma dosyalarını konsoldan indirir ve ardından bunları Unity projenize taşırsınız).

Verileri Kaydetme

Firebase Gerçek Zamanlı Veritabanına veri yazmanın beş yöntemi vardır:

Yöntem Yaygın kullanımlar
SetValueAsync() users/<user-id>/<username> gibi tanımlı bir yola veri yazın veya değiştirin.
SetRawJsonValueAsync() users/<user-id>/<username> gibi verileri ham Json ile yazın veya değiştirin.
Push() Bir veri listesine ekleyin. Push() öğesini her çağırdığınızda, Firebase user-scores/<user-id>/<unique-score-id> gibi benzersiz tanımlayıcı olarak da kullanılabilen benzersiz bir anahtar oluşturur.
UpdateChildrenAsync() Tüm verileri değiştirmeden tanımlanmış bir yol için bazı anahtarları güncelleyin.
RunTransaction() Eşzamanlı güncellemelerle bozulabilecek karmaşık verileri güncelleyin.

Veritabanı Referansı Alın

Veritabanına veri yazmak için bir DatabaseReference örneğine ihtiyacınız vardır:

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 referansta veri yazma, güncelleme veya silme

Temel yazma işlemleri

Temel yazma işlemleri için, SetValueAsync() yöntemini kullanarak verileri belirtilen bir referansa kaydedebilir ve bu yoldaki varolan tüm verileri değiştirebilirsiniz. Mevcut JSON türlerine karşılık gelen türleri aşağıdaki gibi geçirmek için bu yöntemi kullanabilirsiniz:

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

Yazılı bir C# nesnesi kullanıyorsanız, nesneyi ham Json'a dönüştürmek ve SetRawJsonValueAsync() öğesini çağırmak için yerleşik JsonUtility.ToJson() öğesini kullanabilirsiniz. Örneğin, aşağıdaki gibi görünen bir User 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() ile bir kullanıcıyı şu ş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ıldığında, alt düğümler de dahil olmak üzere belirtilen konumdaki verilerin üzerine yazılır. Ancak yine de tüm nesneyi yeniden yazmadan bir çocuğu 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);

Bir veri listesine ekleme

Çok kullanıcılı uygulamalarda bir listeye veri eklemek için Push() yöntemini kullanın. Push() yöntemi, belirtilen Firebase referansına her yeni çocuk eklendiğinde benzersiz bir anahtar oluşturur. Listedeki her yeni öğe için otomatik olarak oluşturulan bu anahtarları kullanarak, birkaç istemci yazma çakışmaları olmadan aynı konuma aynı anda alt öğeler ekleyebilir. Push() tarafından oluşturulan benzersiz anahtar, bir zaman damgasına dayalıdır, bu nedenle liste öğeleri otomatik olarak kronolojik olarak sıralanır.

Çocuğun otomatik olarak oluşturulan anahtarının değerini almak veya çocuk için set verilerini almak için Push() yöntemi tarafından döndürülen yeni verilere yapılan başvuruyu kullanabilirsiniz. Bir Push() başvurusunda Key çağrılması, otomatik olarak oluşturulan anahtarın değerini döndürür.

Belirli alanları güncelle

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

UpdateChildrenAsync() öğesini çağırırken, anahtar için bir yol belirterek alt düzey alt değerleri güncelleyebilirsiniz. Veriler daha iyi ölçeklendirmek için birden çok konumda depolanıyorsa, veri yayma özelliğini kullanarak bu verilerin tüm örneklerini güncelleyebilirsiniz. Örneğin, bir oyunun LeaderboardEntry sınıfı şöyle 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;
    }
}

Bir LeaderboardEntry oluşturmak ve aynı anda bunu en son skor beslemesine ve kullanıcının kendi skor listesine güncellemek için oyun şuna benzer 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 örnek /scores/$key adresindeki tüm kullanıcılar için girişleri içeren düğümde bir giriş oluşturmak ve aynı anda Key ile anahtarı almak için Push() kullanır. Anahtar daha sonra kullanıcının /user-scores/$userid/$key adresindeki puanlarında ikinci bir giriş oluşturmak için kullanılabilir.

Bu yolları kullanarak, tek bir UpdateChildrenAsync() çağrısıyla JSON ağacındaki birden çok konumda eş zamanlı güncellemeler gerçekleştirebilirsiniz; örneğin, bu örneğin her iki konumda da yeni girişi nasıl oluşturduğu gibi. Bu şekilde yapılan eşzamanlı güncellemeler atomiktir: ya tüm güncellemeler başarılı olur ya da tüm güncellemeler başarısız olur.

Verileri sil

Verileri silmenin en basit yolu, söz konusu verinin konumu referans alınarak RemoveValue() öğesini çağırmaktır.

SetValueAsync() veya UpdateChildrenAsync() gibi başka bir yazma işleminin değeri olarak null belirterek de silebilirsiniz. Tek bir API çağrısında birden çok alt öğeyi silmek için bu tekniği UpdateChildrenAsync() ile kullanabilirsiniz.

Verilerinizin ne zaman işlendiğini öğrenin.

Verilerinizin Firebase Gerçek Zamanlı Veritabanı sunucusuna ne zaman kaydedildiğini öğrenmek için bir devam ekleyebilirsiniz. Hem SetValueAsync() hem de UpdateChildrenAsync() işlemin ne zaman tamamlandığını bilmenizi sağlayan bir Task döndürür. Çağrı herhangi bir nedenle başarısız olursa Tasks IsFaulted , hatanın neden oluştuğunu belirten Exception özelliği ile true olacaktır.

Verileri işlem olarak kaydet

Artımlı sayaçlar gibi eşzamanlı değişikliklerle bozulabilecek verilerle çalışırken bir işlem işlemi kullanabilirsiniz. Bu işleme bir Func verirsiniz. Bu güncelleme Func verilerin mevcut durumunu argüman olarak alır ve yazmak istediğiniz yeni istenen durumu döndürür. Yeni değeriniz başarıyla yazılmadan önce başka bir istemci konuma yazarsa, güncelleme işleviniz yeni geçerli değerle tekrar çağrılır ve yazma yeniden denenir.

Örneğin, bir oyunda, kullanıcıların en yüksek beş skorla skor tablosunu güncellemesine izin verebilirsiniz:

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şlemin kullanılması, birden çok kullanıcı aynı anda puanları kaydederse veya müşterinin eski verileri varsa, lider tablosunun yanlış olmasını önler. İşlem reddedilirse sunucu, işlemi güncellenen değerle yeniden çalıştıran istemciye geçerli değeri döndürür. Bu, işlem kabul edilene veya çok fazla girişimde bulunulana kadar tekrarlanır.

Çevrimdışı veri yaz

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

Bir Firebase veritabanına bağlı her istemci, tüm etkin verilerin kendi dahili sürümünü korur. Veri yazıldığında, önce bu yerel sürüme yazılır. Firebase istemcisi daha sonra bu verileri uzak veritabanı sunucularıyla ve diğer istemcilerle "en iyi çaba" esasına göre senkronize eder.

Sonuç olarak, veritabanına yapılan tüm yazma işlemleri, herhangi bir veri sunucuya yazılmadan hemen önce yerel olayları tetikler. Bu, uygulamanızın ağ gecikmesinden veya bağlantıdan bağımsız olarak yanıt vermeye devam ettiği anlamına gelir.

Bağlantı yeniden sağlandıktan sonra uygulamanız, herhangi bir özel kod yazmak zorunda kalmadan istemcinin geçerli sunucu durumuyla eşitlenmesi için uygun olay kümesini alır.

Sonraki adımlar