Menyimpan Data

Sebelum memulai

Sebelum dapat menggunakan Firebase Realtime Database, Anda harus membuat project Firebase dan menambahkan paket Firebase Unity SDK ke project Unity Anda.

Penyiapan:

Prasyarat

Android

  • Unity 5.0 atau yang lebih baru
  • Android NDK versi 10d atau yang lebih baru

iOS

  • Unity 5.0 atau yang lebih baru
  • Xcode 8.0 atau yang lebih baru

Jika Anda belum memiliki project Unity, download salah satu sampel quickstart kami dan cobalah dengan fitur Firebase tertentu. Jika Anda menggunakan quickstart, ingatlah untuk mendapatkan ID paket dari setelan project karena akan diperlukan untuk langkah selanjutnya.

Menyiapkan aplikasi Anda di Firebase console

Untuk menambahkan Firebase ke aplikasi Anda, Anda memerlukan project Firebase dan file konfigurasi Firebase untuk aplikasi Anda.

Untuk membuat project Firebase:

  1. Buka Firebase console.

  2. Klik Tambahkan project, lalu pilih atau masukkan Nama project .

    • Jika Anda memiliki project Google yang terkait dengan aplikasi Anda, pilih project tersebut dari menu dropdown Nama project .
    • Jika Anda belum memiliki project Google, masukkan Nama project yang baru.
  3. (Opsional) Edit Project ID.

    Firebase menetapkan ID unik ke project Firebase Anda secara otomatis. ID ini ditampilkan di layanan Firebase yang tersedia untuk publik, misalnya:

    • URL database default — your-project-id.firebaseio.com
    • Subdomain hosting default — your-project-id.firebaseapp.com
  4. Ikuti langkah-langkah penyiapan yang tersisa, lalu klik Buat project (atau Tambahkan Firebase jika Anda menggunakan project Google yang sudah ada).

Firebase menyediakan resource untuk project Firebase Anda secara otomatis. Proses ini biasanya perlu waktu beberapa menit. Setelah selesai, Anda akan dibawa ke halaman ringkasan untuk project Firebase Anda di Firebase console.

Android

  1. Klik Tambahkan Firebase ke aplikasi Android Anda dan ikuti langkah-langkah penyiapannya. Jika Anda mengimpor project Google yang sudah ada, prosesnya dapat terjadi secara otomatis dan Anda dapat langsung mendownload file konfigurasi.
  2. Saat diminta, masukkan nama paket aplikasi Anda. Anda harus memasukkan nama paket yang digunakan oleh aplikasi Anda, yang hanya dapat dilakukan jika aplikasi tersebut ditambahkan ke project Firebase Anda.
  3. Selama proses ini, Anda akan mendownload file google-services.json. Anda dapat mendownload file ini lagi kapan saja.
  4. Setelah Anda menambahkan kode inisialisasi, jalankan aplikasi Anda untuk mengirimkan verifikasi ke Firebase console bahwa Anda telah berhasil menginstal Firebase.

iOS

  1. Klik Tambahkan Firebase ke aplikasi iOS Anda dan ikuti langkah penyiapannya. Jika Anda mengimpor project Google yang sudah ada, prosesnya dapat terjadi secara otomatis dan Anda dapat langsung mendownload file konfigurasi.
  2. Saat diminta, masukkan ID paket aplikasi Anda. Anda harus memasukkan ID paket yang digunakan aplikasi. Hal ini hanya dapat dilakukan saat Anda menambahkan aplikasi tersebut ke project Firebase Anda.
  3. Selama proses ini, Anda akan mendownload file GoogleService-Info.plist. Anda dapat mendownload file ini lagi kapan saja.
  4. Setelah Anda menambahkan kode inisialisasi, jalankan aplikasi Anda untuk mengirimkan verifikasi ke Firebase console bahwa Anda telah berhasil menginstal Firebase.
  5. Pindahkan GoogleService-Info.plist yang didownload dari Firebase console ke folder mana pun di project Unity.

Menambahkan Firebase Unity SDK ke aplikasi Anda

  1. Download Firebase Unity SDK.
  2. Pilih item menu Assets > Import Package > Custom Package.
  3. Impor FirebaseDatabase.unitypackage dari direktori yang sesuai dengan versi Unity yang Anda gunakan:
    • Unity 5.x dan versi yang lebih lama menggunakan framework .NET 3.x, jadi Anda perlu mengimpor paket dotnet3/FirebaseDatabase.unitypackage .
    • Unity 2017.x dan versi yang lebih baru mendukung penggunaan framework .NET 4.x. Jika project Anda dikonfigurasi agar dapat menggunakan .NET 4.x, impor paket dotnet4/FirebaseDatabase.unitypackage .
  4. Saat jendela Import Unity Package muncul, klik tombol Import.

Menginisialisasi SDK

Firebase Unity SDK di Android memerlukan layanan Google Play versi terbaru sebelum SDK dapat digunakan. Kode berikut harus ditambahkan di awal aplikasi Anda untuk memeriksa dan mengupdate layanan Google Play secara opsional ke versi yang diperlukan oleh Firebase Unity SDK sebelum memanggil metode lain di SDK.

Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
  var dependencyStatus = task.Result;
  if (dependencyStatus == Firebase.DependencyStatus.Available) {
    // Create and hold a reference to your FirebaseApp, i.e.
    //   app = Firebase.FirebaseApp.DefaultInstance;
    // where app is a Firebase.FirebaseApp property of your application class.

    // Set a flag here indicating that Firebase is ready to use by your
    // application.
  } else {
    UnityEngine.Debug.LogError(System.String.Format(
      "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
    // Firebase Unity SDK is not safe to use here.
  }
});

Membuat aplikasi Anda

Android

  1. Pilih opsi menu File > Build Settings.
  2. Pilih Android di daftar Platform.
  3. Klik Switch Platform untuk memilih Android sebagai platform target.
  4. Tunggu hingga ikon pemutar (pengompilasi) di sudut kanan bawah status bar Unity berhenti.
  5. Klik Build and Run.

iOS

  1. Pilih opsi menu File > Build Settings.
  2. Pilih iOS di daftar Platform.
  3. Klik Switch Platform untuk memilih iOS sebagai platform target.
  4. Tunggu hingga ikon pemutar (pengompilasi) di sudut kanan bawah status bar Unity berhenti.
  5. Klik Build and Run.

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

Kirim masukan tentang...

Butuh bantuan? Kunjungi halaman dukungan kami.