Datenvolumen sparen

Hinweis

Vor der Verwendung Realtime Database, sind folgende Schritte erforderlich:

  • Registrieren Sie Ihr Unity-Projekt und konfigurieren Sie es für die Verwendung von Firebase.

    • Wenn Ihr Unity-Projekt bereits Firebase verwendet, registriert und für Firebase konfiguriert.

    • Wenn Sie kein Unity-Projekt haben, können Sie Beispiel-App.

  • Fügen Sie das Firebase Unity SDK (insbesondere FirebaseDatabase.unitypackage) hinzu: Ihr Unity-Projekt.

Das Hinzufügen von Firebase zu Ihrem Unity-Projekt umfasst Aufgaben sowohl in der FirebaseConsole als auch in Ihrem geöffneten Unity-Projekt. Sie laden beispielsweise Firebase-Konfigurationsdateien aus der Console herunter und verschieben sie dann in Ihr Unity-Projekt.

Daten werden gespeichert

Es gibt fünf Methoden zum Schreiben von Daten in Firebase Realtime Database:

Methode Übliche Anwendungsbereiche
SetValueAsync() Daten in einen definierten Pfad schreiben oder ersetzen, z. B. users/<user-id>/<username>
SetRawJsonValueAsync() Daten mit Roh-JSON schreiben oder ersetzen, z. B. users/<user-id>/<username>.
Push() Daten zu einer Liste hinzufügen. Jedes Mal, wenn Sie Push() aufrufen, generiert Firebase einen eindeutigen Schlüssel, der auch als eindeutige Kennung verwendet werden kann, z. B. user-scores/<user-id>/<unique-score-id>.
UpdateChildrenAsync() Einige Schlüssel für einen definierten Pfad aktualisieren, ohne alle Daten zu ersetzen.
RunTransaction() Aktualisieren Sie komplexe Daten, die durch gleichzeitige Aktualisierungen beschädigt werden könnten.

Datenbankreferenz abrufen

Zum Schreiben von Daten in die Datenbank benötigen Sie eine Instanz von 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;
  }
}

Daten in einer Referenz schreiben, aktualisieren oder löschen

Grundlegende Schreibvorgänge

Für grundlegende Schreibvorgänge können Sie mit SetValueAsync() Daten in einem Referenz angegeben, wodurch alle unter diesem Pfad vorhandenen Daten ersetzt werden. Sie können diese , um Typen zu übergeben, die den verfügbaren JSON-Typen entsprechen:

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

Wenn Sie ein typisiertes C#-Objekt verwenden, können Sie die integrierte Funktion JsonUtility.ToJson() verwenden, um das Objekt in reinen JSON-Code umzuwandeln und SetRawJsonValueAsync() aufzurufen. Angenommen, Sie haben eine User-Klasse, die so aussieht:

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

    public User() {
    }

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

So fügen Sie einen Nutzer mit SetRawJsonValueAsync() hinzu:

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

Wenn Sie SetValueAsync() oder SetRawJsonValueAsync() auf diese Weise verwenden, werden Daten überschrieben an dem angegebenen Ort, einschließlich aller untergeordneten Knoten. Sie können jedoch ein untergeordnetes Objekt aktualisieren, ohne das gesamte Objekt neu zu schreiben. Wenn Sie Nutzern erlauben möchten, ihre Profile zu aktualisieren, können Sie den Nutzernamen so aktualisieren:

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

An eine Datenliste anhängen

Verwenden Sie die Methode Push(), um Daten an eine Liste in Anwendungen mit mehreren Nutzern anzuhängen. Die Methode Push() generiert jedes Mal einen eindeutigen Schlüssel, wenn ein neuer Schlüssel wird der angegebenen Firebase-Referenz hinzugefügt. Mit diesen automatisch generierten Schlüssel für jedes neue Element in der Liste, können mehrere Clients fügen Sie untergeordnete Elemente ohne Schreibkonflikte gleichzeitig demselben Speicherort hinzu. Die Der von Push() generierte eindeutige Schlüssel basiert auf einem Zeitstempel. Listenelemente werden daher automatisch chronologisch sortiert.

Sie können die Referenz auf die neuen Daten verwenden, die von der Push()-Methode zurückgegeben werden, um den Wert des automatisch generierten Schlüssels des untergeordneten Elements abzurufen oder Daten für das untergeordnete Element festzulegen. Anrufen Key in einer Push()-Referenz gibt den Wert von automatisch generierten Schlüssel.

Bestimmte Felder aktualisieren

Um gleichzeitig in bestimmte untergeordnete Knoten eines Knotens zu schreiben, ohne andere untergeordneten Knoten, verwenden Sie die Methode UpdateChildrenAsync().

Wenn Sie UpdateChildrenAsync() aufrufen, können Sie untergeordnete Werte auf niedrigerer Ebene aktualisieren, indem Sie und gibt einen Pfad für den Schlüssel an. Wenn Daten bedarfsgerecht an mehreren Standorten gespeichert sind können Sie alle Instanzen dieser Daten Daten-Fan-out. Beispiel: Das Spiel könnte eine LeaderboardEntry-Klasse wie diese haben:

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

Um einen LeaderboardEntry zu erstellen und ihn gleichzeitig auf die aktuelle Punktzahl zu aktualisieren und der eigenen Punktzahlliste des Nutzers verwendet, verwendet das Spiel folgenden Code:

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

In diesem Beispiel wird Push() verwendet, um einen Eintrag in dem Knoten zu erstellen, der Einträge für alle Nutzer in /scores/$key und rufen den Schlüssel gleichzeitig mit Key Mit dem Schlüssel kann dann ein zweiter Eintrag im Punkte bei /user-scores/$userid/$key.

Mit diesen Pfaden können Sie gleichzeitige Aktualisierungen für mehrere Standorte in JSON-Baum mit einem einzelnen Aufruf von UpdateChildrenAsync() an, z. B. wie das wird der neue Eintrag an beiden Orten erstellt. Simultane Aktualisierungen auf diese Weise sind atomar: Entweder sind alle Aktualisierungen erfolgreich oder alle schlagen fehl.

Daten löschen

Die einfachste Möglichkeit, Daten zu löschen, besteht darin, RemoveValue() für einen Verweis auf die Speicherort dieser Daten.

Zum Löschen können Sie auch null als Wert für einen weiteren Schreibvorgang angeben. wie SetValueAsync() oder UpdateChildrenAsync(). Sie können diese mit UpdateChildrenAsync() mehrere untergeordnete Elemente in einer einzelnen API löschen aufrufen.

Wissen, wann ein Commit für Ihre Daten erforderlich ist.

Um zu erfahren, wann Ihre Daten per Commit auf den Firebase Realtime Database-Server übertragen werden, müssen Sie eine Fortsetzung hinzufügen. SetValueAsync() und UpdateChildrenAsync() eine Task zurückgeben, die angibt, wann der Vorgang abgeschlossen ist. Wenn die wenn der Aufruf aus irgendeinem Grund nicht erfolgreich ist, wird die IsFaulted für Tasks mit dem Exception-Attribut, das angibt, warum der Fehler aufgetreten ist.

Daten als Transaktionen speichern

Wenn Sie mit Daten arbeiten, die durch gleichzeitige Änderungen beschädigt werden können, z. B. mit inkrementellen Zählern, können Sie einen Transaktionsvorgang verwenden. Sie vergeben diesen Vorgang an Func. Dieses Update „Func“ verwendet den aktuellen Status als Argument und gibt den gewünschten neuen Status zurück. Schreiben. Wenn ein anderer Client in den Speicherort schreibt, bevor der neue Wert geschrieben wurde, wird die Aktualisierungsfunktion erneut mit der neuen und der Schreibvorgang wird wiederholt.

Beispielsweise können Sie Nutzern in einem Spiel ermöglichen, eine Bestenliste mit die fünf höchsten Werte:

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

Durch eine Transaktion wird verhindert, dass die Bestenliste falsch ist, wenn mehrere Nutzer gleichzeitig Punktzahlen erfassen oder der Kunde hatte veraltete Daten. Wenn die Transaktion abgelehnt wird, gibt der Server den aktuellen Wert an den Client zurück, der die Transaktion dann noch einmal mit dem aktualisierten Wert ausführt. Dies wiederholt sich, bis Transaktion akzeptiert oder zu viele Versuche unternommen.

Daten offline schreiben

Wenn ein Client die Netzwerkverbindung verliert, funktioniert deine App weiterhin korrekt sind.

Jeder Client, der mit einer Firebase-Datenbank verbunden ist, verwaltet eine eigene interne Version von allen aktiven Daten. Beim Schreiben von Daten werden sie zuerst in diese lokale Version geschrieben. Der Firebase-Client synchronisiert diese Daten dann mit der Remotedatenbank. mit anderen Clients auf Best-Effort-Basis zu verstehen.

Folglich lösen alle Schreibvorgänge in die Datenbank lokale Ereignisse unmittelbar vor der werden alle Daten auf den Server geschrieben. Das bedeutet, dass Ihre App und unabhängig von der Netzwerklatenz oder der Konnektivität reaktionsschnell ist.

Sobald die Verbindung wiederhergestellt ist, erhält Ihre App die entsprechenden um eine Synchronisierung mit dem aktuellen Serverstatus zu ermöglichen, benutzerdefinierten Code schreiben.

Nächste Schritte