Verileri Kaydet

Başlamadan önce

Realtime Database özelliğini kullanabilmek için:

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

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

    • Unity projeniz yoksa örnek bir uygulama indirebilirsiniz.

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

Firebase'i Unity projenize 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 indirip Unity projenize taşırsınız).

Verileri Kaydetme

Firebase Realtime Database'e veri yazmanın beş yöntemi vardır:

Yöntem Yaygın kullanım alanları
SetValueAsync() users/<user-id>/<username> gibi tanımlanmış bir yola veri yazma veya verileri değiştirme
SetRawJsonValueAsync() Verileri ham JSON ile yazın veya değiştirin (ör. users/<user-id>/<username>).
Push() Veri listesine ekleyin. Push() işlevini her çağırdığınızda Firebase, user-scores/<user-id>/<unique-score-id> gibi benzersiz bir tanımlayıcı olarak da kullanılabilen benzersiz bir anahtar oluşturur.
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.

Veritabanı Referansı Alma

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 referanstaki verileri yazma, güncelleme veya silme

Temel yazma işlemleri

Temel yazma işlemlerinde, verileri belirtilen bir referansa kaydetmek ve söz konusu yoldaki mevcut tüm verileri değiştirmek için SetValueAsync() kullanabilirsiniz. Kullanılabilir JSON türlerine karşılık gelen türleri aşağıdaki gibi iletmek için bu yöntemi kullanabilirsiniz:

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

Tanımlanmış 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 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() 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() öğesini bu şekilde kullanmak, alt düğümler dahil olmak üzere belirtilen konumdaki verilerin üzerine yazar. 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 şekilde güncelleyebilirsiniz:

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

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 birçok istemci, yazma çakışmaları olmadan aynı anda aynı konuma alt öğeler ekleyebilir. Push() tarafından oluşturulan benzersiz anahtar bir zaman damgasına dayanır. Bu nedenle liste öğeleri otomatik olarak kronolojik olarak sıralanır.

Alt öğenin otomatik olarak oluşturulan anahtarının değerini almak veya alt öğe için veri ayarlamak üzere Push() yöntemi tarafından döndürülen yeni verilere referans verebilirsiniz. Push() referansında Key çağrısı yapıldığında otomatik olarak oluşturulan anahtarın değeri döndürülür.

Belirli alanları güncelleme

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() çağrısı yaparken anahtar için bir yol belirterek alt düzeydeki alt öğe değerlerini güncelleyebilirsiniz. Veriler daha iyi ölçeklendirme için birden fazla konumda depolanıyorsa veri dağıtımını kullanarak bu verilerin tüm örneklerini güncelleyebilirsiniz. Örneğin, bir oyunda şuna benzer 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&ltstring, Object&gt entryValues = entry.ToDictionary();

    Dictionary&ltstring, Object&gt childUpdates = new Dictionary&ltstring, Object&gt();
    childUpdates["/scores/" + key] = entryValues;
    childUpdates["/user-scores/" + userId + "/" + key] = entryValues;

    mDatabase.UpdateChildrenAsync(childUpdates);
}

Bu örnekte, /scores/$key'daki tüm kullanıcıların girişlerini içeren bir giriş oluşturmak için Push() kullanılır ve Key ile anahtar aynı anda alınır. Anahtar daha sonra /user-scores/$userid/$key adresindeki kullanıcı puanlarına ikinci bir giriş oluşturmak için kullanılabilir.

Bu yolları kullanarak, UpdateChildrenAsync() çağrısını tek seferde yaparak JSON ağacındaki birden fazla konumda eşzamanlı güncellemeler yapabilirsiniz. Bu örnekte, yeni giriş her iki konumda da oluşturulur. Bu yaklaşım, eş zamanlı olarak yapılan güncellemelerde çok önemli bir rol oynar: 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.

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 fazla çocuğu silmek için bu tekniği UpdateChildrenAsync() ile kullanabilirsiniz.

Verilerinizin ne zaman kayda alındığını öğrenin.

Verilerinizin Firebase Realtime Database sunucusuna ne zaman bağlandığını öğrenmek için devam edebilirsiniz. Hem SetValueAsync() hem de UpdateChildrenAsync(), işlemin tamamlandığını anlamanızı sağlayan bir Task döndürür. Çağrı herhangi bir nedenle başarısız olursa Görevler IsFaulted doğru olur ve Exception mülkü, hatanın nedenini belirtir.

Verileri işlem olarak kaydetme

Artımlı sayaçlar gibi eşzamanlı değişikliklere göre bozulabilecek verilerle çalışırken işlem işlemi kullanabilirsiniz. Bu işleme bir Func atarsınız. Bu güncelleme Func, verilerin mevcut durumunu bağımsız değişken 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 müşteri konuma yazarsa güncelleme işleviniz yeni mevcut değerle tekrar çağrılır ve yazma işlemi yeniden denenir.

Örneğin, bir oyunda kullanıcıların en yüksek beş puanı içeren bir skor tablosunu güncellemelerine izin verebilirsiniz:

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. İşlem kabul edilene veya çok fazla deneme yapılana kadar bu işlem tekrarlanır.

Verileri çevrimdışı yazma

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

Bir Firebase veritabanına bağlı her istemci, etkin verilerin kendi dahili sürümünü korur. Veriler ilk olarak bu yerel sürüme yazılır. Ardından Firebase istemcisi, bu verileri uzak veritabanı sunucularıyla ve diğer istemcilerle "en iyi çaba" temelinde senkronize eder.

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

Bağlantı yeniden kurulduktan sonra uygulamanız, özel kod yazmak zorunda kalmadan istemcinin mevcut sunucu durumuyla senkronize edilmesi için uygun etkinlik grubunu alır.

Sonraki adımlar