儲存資料

事前準備

使用前 即時資料庫, 請完成下列操作:

  • 註冊 Unity 專案,並將其設定為使用 Firebase。

    • 如果您的 Unity 專案已在使用 Firebase, 已完成註冊和設定程序。

    • 如果您沒有 Unity 專案,可以 範例應用程式

  • Firebase Unity SDK (特別是 FirebaseDatabase.unitypackage) 新增至 Unity 專案

請注意,將 Firebase 新增至 Unity 專案時,必須一併執行以下兩者的工作: Firebase 控制台,在開啟的 Unity 專案中 (例如,您可以從控制台下載 Firebase 設定檔,然後 放入您的 Unity 專案中)。

正在儲存資料

將資料寫入 Firebase 即時資料庫的方法有五種:

方法 常見的使用方式
SetValueAsync() 將資料寫入或取代到已定義的路徑,例如 users/<user-id>/<username>
SetRawJsonValueAsync() 使用原始 Json 寫入或取代資料,例如 users/<user-id>/<username>
Push() 新增至資料清單。每次你撥打電話 Push(),Firebase 會產生一組專屬金鑰,也可使用這些金鑰 是專屬 ID user-scores/<user-id>/<unique-score-id>
UpdateChildrenAsync() 更新已定義路徑的部分鍵,但不要替換所有 實體媒介包括儲存空間陣列 傳統硬碟、磁帶和 USB 隨身碟等
RunTransaction() 更新可能因為並行更新而損毀的複雜資料。

取得 DatabaseReference

如要將資料寫入資料庫,您需要 DatabaseReference 的執行個體:

using Firebase;
using Firebase.Database;

public class MyScript: MonoBehaviour {
  void Start() {
    // Get the root reference location of the database.
    DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference;
  }
}

寫入、更新或刪除參照中的資料

基本寫入作業

如果是基本寫入作業,您可以使用 SetValueAsync() 將資料儲存至 來取代該路徑中的任何現有資料。您可以使用 方法來傳遞與可用 JSON 類型對應的類型,如下所示:

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

如果使用型別的 C# 物件,可以使用內建的 JsonUtility.ToJson() 將物件轉換為原始 Json 並呼叫 SetRawJsonValueAsync()。 舉例來說,您可能會有如下所示的 User 類別:

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

    public User() {
    }

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

您可以按照以下方式新增擁有 SetRawJsonValueAsync() 的使用者:

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()SetRawJsonValueAsync() 會覆寫資料 執行個體傳送要求,包含任何子節點。不過, 不必重寫整個物件,即可更新子項。如要允許使用者存取 更新其個人資料,您可以依照下列方式更新使用者名稱:

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

附加至資料清單

使用 Push() 方法,將資料附加至多使用者應用程式中的清單。 Push() 方法會在每次新金鑰時產生專屬金鑰 子元素會加入指定的 Firebase 參考資料。只要使用這些節點 自動產生及自動生成的索引鍵,因此可以有多個用戶端 同時將子項新增到相同的位置,而不會發生寫入衝突。 Push() 產生的不重複索引鍵依據時間戳記,所以清單項目會 會自動依時間排序。

您可以使用 Push() 方法傳回新資料的參照,取得 由子項自動產生的鍵值,或為子項設定資料的值。撥號中 Push() 參照上的 Key 會傳回 自動產生的金鑰

更新特定欄位

於不覆寫其他節點的情況下,同時寫入節點的特定子項 子節點,請使用 UpdateChildrenAsync() 方法。

呼叫 UpdateChildrenAsync() 時,您可以透過 指定金鑰的路徑如果資料儲存在多個位置,以便進行擴充 您可以使用 kubectl 指令 資料擴散傳遞。舉例來說 遊戲可能有如下所示的 LeaderboardEntry 類別:

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

建立 LeaderboardEntry,並同時更新至最新分數 動態消息和使用者自己的得分清單,遊戲會使用類似下方的程式碼:

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

本範例使用 Push() 在包含以下項目的節點中建立項目: 位於 /scores/$key 的所有使用者,並同時擷取 Key。接著,該鍵就會在使用者的 在 /user-scores/$userid/$key 得分。

您可以使用這些路徑,同時更新位於 對 UpdateChildrenAsync() 發出一次呼叫的 JSON 樹狀結構,例如 範例會在兩個位置建立新項目。同時更新了 是不可分割的:所有更新成功或所有更新都失敗

刪除資料

刪除資料最簡單的方法是對對物件的參照呼叫 RemoveValue() 這些資料的位置

您也可以將 null 指定為另一次寫入的值來刪除 例如 SetValueAsync()UpdateChildrenAsync()您可以使用 運用 UpdateChildrenAsync() 技巧,在單一 API 中刪除多個子項 呼叫。

瞭解資料何時修訂。

想知道資料何時會提交至 Firebase 即時資料庫伺服器, 即可加入接續程序SetValueAsync()UpdateChildrenAsync() 傳回 Task,讓您知道作業何時完成。如果 呼叫失敗,此時 Tasks IsFaulted 的值將為 Exception 屬性表示失敗的原因。

將資料儲存為交易

使用可能同時受到並行損毀的資料時 例如增量計數器 交易作業。 您將 Func 提供給此作業。這項更新 (Func) 採用目前狀態 做為引數,並傳回您想要的新狀態 其二是權限,定義可執行的操作 例如讀取或寫入如果其他用戶端在您的新值之前寫入該位置 成功寫入後,系統就會使用新的目前版本,再次呼叫更新函式。 值,並重試寫入。

舉例來說,您可以在遊戲中讓使用者更新排行榜的 五個最高分

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

使用交易時,如果有多個 或用戶端包含過時的資料。如果 交易遭拒,伺服器會將目前的值傳回用戶端 這會使用更新後的值再次執行交易。重複執行直到 交易或進行次數過多

離線寫入資料

如果用戶端的網路連線中斷,您的應用程式會繼續運作 正確。

連接至 Firebase 資料庫的所有用戶端都會保有自己的內部版本 任何有效資料。寫入資料時,會寫入這個本機版本 首先。接著 Firebase 用戶端會將這些資料與遠端資料庫同步處理 並與其他用戶端共用。

因此,所有寫入資料庫的動作都會立即觸發本機事件, 任何資料都會寫入伺服器也就是說,您的應用程式 回應,無論網路延遲或連線。

連線恢復後,應用程式會收到一組適當的 以便用戶端與目前的伺服器狀態同步, 即可撰寫任何自訂程式碼

後續步驟