Mit den Firebase Data Connect Client-SDKs können Sie Ihre serverseitigen Abfragen und Mutationen direkt über eine Firebase-App aufrufen. Sie generieren parallel ein benutzerdefiniertes Client-SDK, während Sie die Schemas, Abfragen und Mutationen entwerfen, die Sie in Ihrem Data Connect Dienst bereitstellen. Anschließend binden Sie Methoden aus diesem SDK in Ihre Clientlogik ein.
Wie bereits erwähnt, ist es wichtig zu beachten, dass Data Connect Abfragen und Mutationen nicht vom Clientcode gesendet und auf dem Server ausgeführt werden. Stattdessen werden nach der Bereitstellung Data Connect Vorgänge auf dem Server wie Cloud Functions gespeichert. Das bedeutet, dass Sie entsprechende clientseitige Änderungen bereitstellen müssen, um Probleme für bestehende Nutzer zu vermeiden (z. B. bei älteren App-Versionen).
Aus diesem Grund bietet Data Connect eine Entwicklungsumgebung und Tools, mit denen Sie Prototypen für Ihre serverseitig bereitgestellten Schemas, Abfragen und Mutationen erstellen können. Außerdem werden während der Prototyperstellung automatisch clientseitige SDKs generiert.
Nachdem Sie die Updates für Ihre Dienst- und Client-Apps durchlaufen haben, können sowohl serverseitige als auch clientseitige Updates bereitgestellt werden.
Kotlin-SDK generieren
Verwenden Sie die Firebase CLI, um Data Connect generierte SDKs in Ihren Apps einzurichten.
Mit dem Befehl init sollten alle Apps im aktuellen Ordner erkannt und generierte SDKs automatisch installiert werden.
firebase init dataconnect:sdk
SDKs während der Prototyperstellung aktualisieren
Wenn Sie die Data Connect VS Code-Erweiterung installiert haben, werden generierte SDKs immer auf dem neuesten Stand gehalten.
Wenn Sie die Data Connect VS Code-Erweiterung nicht verwenden, können Sie generierte SDKs mit der Firebase CLI auf dem neuesten Stand halten.
firebase dataconnect:sdk:generate --watchSDKs in Build-Pipelines generieren
Mit der Firebase CLI können Sie Data Connect SDKs in CI/CD-Build-Prozessen generieren.
firebase dataconnect:sdk:generateClientcode einrichten
Data Connect in Clientcode einbinden
Wenn Sie Ihren Clientcode für die Verwendung von Data Connect und Ihrem generierten SDK, einrichten möchten, folgen Sie zuerst der Standardeinrichtung für Firebase Anweisungen.
Fügen Sie dann Folgendes in den Abschnitt plugins in app/build.gradle.kts ein:
// The Firebase team tests with version 1.8.22; however, other 1.8 versions,
// and all newer versions are expected work too.
kotlin("plugin.serialization") version "1.8.22" // MUST match the version of the Kotlin compiler
Fügen Sie dann Folgendes in den Abschnitt dependencies in app/build.gradle.kts ein:
implementation(platform("com.google.firebase:firebase-bom:34.11.0"))
implementation("com.google.firebase:firebase-dataconnect")
implementation("com.google.firebase:firebase-auth") // Optional
implementation("com.google.firebase:firebase-appcheck") // Optional
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") // Newer versions should work too
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1") // Newer versions should work too
Data Connect Android SDK initialisieren
Initialisieren Sie Ihre Data Connect-Instanz mit den Informationen, die Sie zum Einrichten von Data Connect verwendet haben. Alle Informationen finden Sie in der Firebase Console auf dem Tab „Data Connect“.
Das ConnectorConfig-Objekt
Das SDK erfordert ein Connector-Konfigurationsobjekt.
Dieses Objekt wird automatisch aus serviceId und location in dataconnect.yaml und connectorId in connector.yaml generiert.
Connector-Instanz abrufen
Nachdem Sie ein Konfigurationsobjekt eingerichtet haben, rufen Sie eine Data Connect
Connector-Instanz ab. Der Code für Ihren Connector wird vom
Data Connect Emulator generiert. Wenn der Name Ihres Connectors movies ist und das Kotlin-Paket com.myapplication lautet, wie in connector.yaml angegeben, rufen Sie das Connector-Objekt mit folgendem Aufruf ab:
val connector = com.myapplication.MoviesConnector.instance
Abfragen und Mutationen aus dem Android SDK verwenden
Mit dem Connector-Objekt können Sie Abfragen und Mutationen ausführen, wie im GraphQL-Quellcode definiert. Angenommen, für Ihren Connector sind die folgenden Vorgänge definiert:
mutation createMovie($title: String!, $releaseYear: Int!, $genre: String!, $rating: Int!) {
movie_insert(data: {
title: $title
releaseYear: $releaseYear
genre: $genre
rating: $rating
})
}
query getMovieByKey($key: Movie_Key!) {
movie(key: $key) { id title }
}
query listMoviesByGenre($genre: String!) {
movies(where: {genre: {eq: $genre}}) {
id
title
}
}
Dann können Sie einen Film so erstellen und abrufen:
val connector = MoviesConnector.instance
val addMovieResult1 = connector.createMovie.execute(
title = "Empire Strikes Back",
releaseYear = 1980,
genre = "Sci-Fi",
rating = 5
)
val movie1 = connector.getMovieByKey.execute(addMovieResult1.data.key)
println("Empire Strikes Back: ${movie1.data.movie}")
Sie können auch mehrere Filme abrufen:
val connector = MoviesConnector.instance
val addMovieResult2 = connector.createMovie.execute(
title="Attack of the Clones",
releaseYear = 2002,
genre = "Sci-Fi",
rating = 5
)
val listMoviesResult = connector.listMoviesByGenre.execute(genre = "Sci-Fi")
println(listMoviesResult.data.movies)
Sie können auch einen Flow erfassen, der nur ein Ergebnis liefert, wenn ein neues Abfrageergebnis mit einem Aufruf der execute()-Methode der Abfrage abgerufen wird.
val connector = MoviesConnector.instance
connector.listMoviesByGenre.flow(genre = "Sci-Fi").collect { data ->
println(data.movies)
}
connector.createMovie.execute(
title="A New Hope",
releaseYear = 1977,
genre = "Sci-Fi",
rating = 5
)
connector.listMoviesByGenre.execute(genre = "Sci-Fi") // will cause the Flow to get notified
Änderungen an Enumerationsfeldern verarbeiten
Das Schema einer App kann Enumerationen enthalten, auf die mit GraphQL-Abfragen zugegriffen werden kann.
Wenn sich das Design einer App ändert, können Sie neue unterstützte Enumerationswerte hinzufügen. Angenommen, Sie entscheiden sich später im Lebenszyklus Ihrer Anwendung, der Enumeration AspectRatio den Wert FULLSCREEN hinzuzufügen.
Im Data Connect Workflow können Sie lokale Entwicklungstools verwenden, um Ihre Abfragen und SDKs zu aktualisieren.
Bevor Sie jedoch eine aktualisierte Version Ihrer Clients veröffentlichen, können ältere bereitgestellte Clients Probleme verursachen.
Beispiel für eine robuste Implementierung
Das generierte SDK erzwingt die Verarbeitung unbekannter Werte, da der Code des Kunden das
EnumValue Objekt entpacken muss. Dieses ist entweder EnumValue.Known für bekannte Enumerations
werte oder EnumValue.Unknown für unbekannte Werte.
val result = connector.listMoviesByAspectRatio.execute(AspectRatio.WIDESCREEN)
val encounteredAspectRatios = mutableSetOf<String>()
result.data.movies
.mapNotNull { it.otherAspectRatios }
.forEach { otherAspectRatios ->
otherAspectRatios
.filterNot { it.value == AspectRatio.WIDESCREEN }
.forEach {
when (it) {
is EnumValue.Known -> encounteredAspectRatios.add(it.value.name)
is EnumValue.Unknown ->
encounteredAspectRatios.add("[unknown ratio: ${it.stringValue}]")
}
}
}
println(
"Widescreen movies also include additional aspect ratios: " +
encounteredAspectRatios.sorted().joinToString()
)
Prototyp erstellen und Android-Anwendung testen
Clients für die Verwendung eines lokalen Emulators instrumentieren
Sie können den Data Connect Emulator verwenden, entweder über die Data Connect VS Code-Erweiterung oder über die CLI.
Die Instrumentierung der App für die Verbindung zum Emulator ist in beiden Fällen gleich.
val connector = MoviesConnector.instance
// Connect to the emulator on "10.0.2.2:9399"
connector.dataConnect.useEmulator()
// (alternatively) if you're running your emulator on non-default port:
connector.dataConnect.useEmulator(port = 9999)
// Make calls from your app
Wenn Sie zu Produktionsressourcen wechseln möchten, kommentieren Sie die Zeilen für die Verbindung zum Emulator aus.
Datentypen in Data Connect SDKs
Der Data Connect Server stellt allgemeine und benutzerdefinierte GraphQL-Daten typen dar. Diese werden im SDK so dargestellt:
| Data Connect Typ | Kotlin |
|---|---|
| String | String |
| Int | Int (32-Bit-Ganzzahl) |
| Float | Double (64-Bit-Gleitkommazahl) |
| Boolesch | Boolesch |
| UUID | java.util.UUID |
| Datum | com.google.firebase.dataconnect.LocalDate (bis Version 16.0.0-beta03 java.util.Date) |
| Zeitstempel | com.google.firebase.Timestamp |
| INT64 | Lang |
| Beliebig | com.google.firebase.dataconnect.AnyValue |