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<string, Object> ToDictionary() { Dictionary<string, Object> result = new Dictionary<string, Object>(); 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 => { 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); }); }
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.