Buka konsol

Menyimpan Data

Sebelum memulai

Sebelum dapat menggunakan Realtime Database, Anda perlu:

  • Mendaftarkan project Unity Anda dan mengonfigurasikannya untuk menggunakan Firebase.

    • Jika project Unity Anda telah menggunakan Firebase, berarti project tersebut telah terdaftar dan dikonfigurasikan untuk Firebase.

    • Jika belum memiliki project Unity, Anda dapat mendownload aplikasi contoh.

  • Menambahkan Firebase Unity SDK (khususnya, FirebaseDatabase.unitypackage) ke project Unity Anda.

Perlu diperhatikan bahwa menambahkan Firebase ke project Unity Anda melibatkan tugas di Firebase console dan di project Unity yang terbuka (misalnya, Anda mendownload file konfigurasi Firebase dari konsol, lalu memindahkannya ke project Unity).

Menyimpan Data

Ada 5 metode untuk menulis data ke Firebase Realtime Database:

Metode Penggunaan umum
SetValueAsync() Menulis atau mengganti data di lokasi yang ditentukan, seperti users/<user-id>/<username>.
SetRawJsonValueAsync() Menulis atau memindahkan data dengan Json murni, seperti users/<user-id>/<username>.
Push() Menambahkan ke daftar data. Setiap kali Anda memanggil Push(), Firebase menghasilkan kunci unik yang juga dapat digunakan sebagai ID unik, seperti user-scores/<user-id>/<unique-score-id>.
UpdateChildrenAsync() Mengupdate beberapa kunci untuk lokasi yang ditetapkan tanpa mengganti semua data.
RunTransaction() Mengupdate data kompleks yang bisa rusak karena update serentak.

Mendapatkan DatabaseReference

Untuk menulis data ke Database, Anda perlu instance DatabaseReference:

using Firebase;
using Firebase.Database;
using Firebase.Unity.Editor;

public class MyScript: MonoBehaviour {
  void Start() {
    // Set up the Editor before calling into the realtime database.
    FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("https://YOUR-FIREBASE-APP.firebaseio.com/");

    // Get the root reference location of the database.
    DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference;
  }
}

Menulis, mengupdate, atau menghapus data pada referensi

Operasi tulis dasar

Untuk operasi tulis dasar, Anda dapat menggunakan SetValueAsync() untuk menyimpan data ke referensi yang ditentukan untuk menggantikan data yang ada di lokasi tersebut. Anda dapat menggunakan metode ini untuk meneruskan jenis yang sesuai dengan jenis JSON yang tersedia sebagai berikut:

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

Jika menggunakan objek C# yang diketik, Anda dapat menggunakan JsonUtility.ToJson() bawaan untuk mengonversi objek ini menjadi Json mentah dan memanggil SetRawJsonValueAsync(). Misalnya, Anda mungkin memiliki class User yang terlihat sebagai berikut:

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

    public User() {
    }

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

Anda dapat menambahkan pengguna dengan SetRawJsonValueAsync() seperti berikut:

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

Menggunakan SetValueAsync() atau SetRawJsonValueAsync() dengan cara ini akan menimpa data di lokasi yang ditentukan, termasuk node turunan. Namun, Anda masih dapat mengupdate turunan tanpa menulis ulang seluruh objek. Jika ingin mengizinkan pengguna untuk mengupdate profil mereka, Anda dapat mengupdate nama pengguna seperti berikut:

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

Menambahkan ke daftar data

Gunakan metode Push() untuk menambahkan data ke daftar dalam aplikasi multipengguna. Metode Push() menghasilkan kunci unik setiap kali turunan baru ditambahkan ke referensi Firebase tertentu. Dengan kunci yang dihasilkan secara otomatis untuk setiap elemen baru dalam daftar, beberapa klien dapat menambahkan turunan ke lokasi yang sama secara bersamaan tanpa mengalami konflik penulisan. Kunci unik yang dihasilkan oleh Push() didasarkan pada stempel waktu, sehingga daftar item otomatis diurutkan secara kronologis.

Anda dapat menggunakan referensi data baru yang ditampilkan oleh metode Push() untuk mendapatkan nilai kunci turunan yang otomatis dihasilkan atau menyetel data untuk turunan. Memanggil Key pada referensi Push() akan menampilkan kunci yang dihasilkan secara otomatis.

Mengupdate kolom tertentu

Untuk menulis ke turunan tertentu dari sebuah node secara simultan tanpa menimpa node turunan yang lain, gunakan metode UpdateChildrenAsync().

Saat memanggil UpdateChildrenAsync(), Anda dapat memperbarui nilai turunan pada tingkat yang lebih rendah dengan menetapkan lokasi untuk kunci tersebut. Jika data disimpan di beberapa lokasi untuk memudahkan penskalaan, Anda dapat mengupdate semua instance dari data tersebut menggunakan fan-out data. Misalnya, suatu game mungkin memiliki class LeaderboardEntry seperti ini:

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

Untuk membuat LeaderboardEntry dan sekaligus mengupdatenya ke feed skor terbaru dan daftar skor milik pengguna, game menggunakan kode seperti ini:

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

Contoh ini menggunakan Push() untuk membuat entri di node yang mengandung entri untuk semua pengguna di /scores/$key dan sekaligus mengambil kunci dengan Key. Selanjutnya, kunci tersebut dapat digunakan untuk membuat entri kedua dalam skor pengguna di /user-scores/$userid/$key.

Menggunakan lokasi tersebut, Anda dapat menjalankan update simultan ke beberapa lokasi di pohon JSON dengan sekali panggilan ke UpdateChildrenAsync(), seperti yang digunakan pada contoh ini untuk membuat entri baru di kedua lokasi. Update bersamaan menjadikan proses ini berjalan menyeluruh: entah semua update berhasil atau semua update gagal.

Menghapus data

Cara termudah untuk menghapus data adalah dengan memanggil RemoveValue() pada referensi ke lokasi data tersebut.

Anda juga dapat menghapus dengan menetapkan null sebagai nilai untuk operasi tulis lainnya, seperti SetValueAsync() atau UpdateChildrenAsync(). Teknik ini dapat digunakan dengan UpdateChildrenAsync() untuk menghapus beberapa turunan dengan satu panggilan API.

Mengetahui kapan data Anda disimpan.

Untuk mengetahui kapan data Anda diserahkan ke server Firebase Realtime Database, Anda bisa menambahkan sebuah kelanjutan. SetValueAsync() dan UpdateChildrenAsync() menghasilkan Task yang memungkinkan Anda untuk mengetahui kapan operasi selesai. Jika panggilan tidak berhasil karena alasan apa pun, Tugas IsFaulted akan menghasilkan true dengan properti Exception yang menunjukkan mengapa kegagalan terjadi.

Menyimpan data sebagai transaksi

Saat menangani data yang dapat rusak akibat modifikasi yang terjadi bersamaan, seperti penghitung inkremental, Anda dapat menggunakan operasi transaksi. Anda memberi operasi ini Func. Func update ini mengambil kondisi data saat ini sebagai argumen dan menampilkan kondisi baru yang ingin Anda tuliskan. Jika klien lainnya melakukan penulisan ke lokasi sebelum nilai baru Anda berhasil ditulis, fungsi update Anda akan dipanggil lagi dengan nilai baru saat ini, lalu proses tulis akan dicoba kembali.

Misalnya, dalam game Anda dapat mengizinkan pengguna untuk mengupdate papan peringkat dengan lima nilai tertinggi:

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

Penggunaan transaksi dapat mencegah kesalahan papan peringkat jika beberapa pengguna mencatat skor secara bersamaan atau jika klien memiliki data yang sudah usang. Jika transaksi ditolak, server akan menampilkan nilai saat ini ke klien yang akan menjalankan lagi transaksi tersebut dengan nilai yang diupdate. Proses ini berulang hingga transaksi diterima atau terlalu banyak percobaan dilakukan.

Menulis data secara offline

Jika koneksi jaringan klien terputus, aplikasi Anda akan tetap berfungsi dengan baik.

Setiap klien yang terhubung ke database Firebase menyimpan versi internalnya sendiri dari setiap data aktif. Ketika ditulis, data akan dituliskan ke versi lokal ini terlebih dahulu. Selanjutnya, klien Firebase menyinkronkan data tersebut dengan server database di tempat lain, dan dengan klien lain berdasarkan "upaya terbaik".

Akibatnya, semua operasi tulis ke database akan segera memicu peristiwa lokal, sebelum ada data yang dituliskan ke server. Ini berarti aplikasi Anda akan tetap responsif, apa pun kondisi latensi atau konektivitas jaringannya.

Setelah konektivitas pulih, aplikasi Anda akan menerima kumpulan peristiwa yang tepat, sehingga klien sinkron dengan kondisi server saat ini, tanpa perlu menulis kode khusus apa pun.

Langkah Berikutnya