儲存資料

事前準備

使用前 Realtime Database、 請完成下列操作:

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

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

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

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

,瞭解如何調查及移除這項存取權。

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

正在儲存資料

將資料寫入 Firebase Realtime Database 的方法有五種:

方法 常見的使用方式
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() 方法,將資料附加至多使用者應用程式中的清單。 每次將新子項新增至指定的 Firebase 參照時,Push() 方法都會產生專屬索引鍵。只要使用這些節點 自動產生及自動生成的索引鍵,因此可以有多個用戶端 同時將子項新增到相同的位置,而不會發生寫入衝突。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&ltstring, Object&gt ToDictionary() {
        Dictionary&ltstring, Object&gt result = new Dictionary&ltstring, Object&gt();
        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 Realtime Database 伺服器, 即可加入接續程序SetValueAsync()UpdateChildrenAsync() 傳回 Task,讓您知道作業何時完成。如果 呼叫失敗,此時 Tasks IsFaulted 的值將為 Exception 屬性表示失敗的原因。

將資料儲存為交易

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

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

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

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

離線寫入資料

如果用戶端失去網路連線,應用程式仍會繼續正常運作。

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

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

重新建立連線後,應用程式會收到適當的事件組合,讓用戶端與目前的伺服器狀態保持同步,而無需撰寫任何自訂程式碼。

後續步驟