Firebase Data Connect クライアント SDK を使用すると、Firebase アプリからサーバーサイドのクエリと ミューテーションを直接呼び出すことができます。Data Connect サービスにデプロイするスキーマ、クエリ、ミューテーションを設計するのと 並行して、カスタム クライアント SDK を生成します。 Data Connect次に、この SDK のメソッドをクライアント ロジックに統合します。
他の場所でも説明したように、Data Connect クエリとミューテーションはクライアントコードによって送信され、 サーバーで実行されるわけではないことに注意してください。代わりに、デプロイされると、Data Connect オペレーションは サーバーに Cloud Functions のように保存されます。つまり、既存のユーザー(古いアプリ バージョンなど)に影響を与えないようにするには、対応するクライアントサイドの変更をデプロイする必要があります。
そのため、Data Connect には、サーバーにデプロイされたスキーマ、クエリ、ミューテーションのプロトタイプを作成できる開発環境と ツールが用意されています。 また、プロトタイプ作成中にクライアントサイド SDK が自動的に生成されます。
サービスとクライアント アプリの更新を繰り返したら、サーバーサイドとクライアントサイドの両方の更新をデプロイできます。
クライアント開発ワークフローとは
スタートガイドに沿って進めた場合は、スタートガイドに沿って進めた場合は、 全体的な開発フローについて説明しました。Data Connectこのガイドでは、スキーマから Android SDK を生成し、クライアントのクエリとミューテーションを操作する方法について詳しく説明します。
要約すると、生成された Android SDK をクライアント アプリで使用するには、次の前提条件を満たす必要があります。
- Android アプリに Firebase を追加する。
- Gradle で Data Connect を依存関係として構成する。
- Kotlin シリアル化 Gradle プラグインと Gradle 依存関係を追加する。
その後の操作は次のとおりです。
- アプリのスキーマを開発する。
SDK の生成を設定する。
- Data Connect VS Code 拡張機能の [Add SDK to app] ボタンを使用する
- を更新する
connector.yaml
Kotlin SDK を生成する
Firebase CLI を使用して、アプリに Data Connect 生成 SDK を設定します。
init コマンドは、現在のフォルダ内のすべてのアプリを検出し、生成された SDK を自動的にインストールします。
firebase init dataconnect:sdk
プロトタイプ作成中に SDK を更新する
Data Connect VS Code 拡張機能がインストールされている場合、生成された SDK は常に最新の状態に保たれます。
Data Connect VS Code 拡張機能を使用しない場合は、Firebase CLI を使用して、生成された SDK を最新の状態に保つことができます。
firebase dataconnect:sdk:generate --watchビルド パイプラインで SDK を生成する
Firebase CLI を使用して、CI/CD ビルドプロセスで Data Connect SDK を生成できます。
firebase dataconnect:sdk:generateクライアントコードを設定する
Data Connect をクライアントコードに組み込む
クライアントコードを Data Connect と生成された SDK を使用するように設定するには、まず 標準の Firebase 設定 の手順に沿って操作します。
次に、app/build.gradle.kts の plugins セクションに以下を追加します。
// 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
次に、app/build.gradle.kts の dependencies セクションに以下を追加します。
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 を初期化する
Data Connect の設定に使用した情報(Firebase コンソールの Data Connect タブで確認可能)を使用して、Data Connect インスタンスを初期化します。
ConnectorConfig オブジェクト
SDK にはコネクタ構成オブジェクトが必要です。
このオブジェクトは、dataconnect.yaml の serviceId と location、connector.yaml の connectorId から自動的に生成されます。
コネクタ インスタンスを取得する
構成オブジェクトを設定したら、Data Connect
コネクタ インスタンスを取得します。コネクタのコードは、
Data Connect エミュレータによって生成されます。connector.yaml で指定されているように、コネクタ名が movies で Kotlin パッケージが com.myapplication の場合は、次の呼び出しでコネクタ オブジェクトを取得します。
val connector = com.myapplication.MoviesConnector.instance
Android SDK のクエリとミューテーションを使用する
コネクタ オブジェクトを使用すると、GraphQL ソースコードで定義されているクエリとミューテーションを実行できます。コネクタに次のオペレーションが定義されているとします。
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
}
}
次のようにして映画を作成して取得できます。
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}")
複数の映画を取得することもできます。
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)
クエリの execute() メソッドの呼び出しを使用して新しいクエリ結果が取得された場合にのみ結果を生成する Flow を収集することもできます。
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
列挙型フィールドの変更を処理する
アプリのスキーマには列挙型を含めることができ、 GraphQL クエリでアクセスできます。
アプリのデザインが変更されると、サポートされる新しい列挙値を追加することがあります。たとえば、アプリケーションのライフサイクルの後半で、AspectRatio 列挙型に FULLSCREEN 値を追加するとします。
Data Connect ワークフローでは、ローカル開発ツールを使用して クエリと SDK を更新できます。
ただし、クライアントの更新バージョンをリリースする前に、デプロイ済みの古いクライアントが破損する可能性があります。
復元力のある実装例
生成された SDK では、不明な値の処理が強制されます。これは、顧客のコードで
EnumValue オブジェクトをアンラップする必要があるためです。このオブジェクトは、既知の列挙値の場合はEnumValue.Known、不明な値の場合はEnumValue.Unknown になります。
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()
)
Android アプリのプロトタイプ作成とテストを行う
ローカル エミュレータを使用するようにクライアントをインストルメントする
Data Connect エミュレータは、 Data Connect VS Code 拡張機能または CLI から使用できます。
エミュレータに接続するようにアプリをインストルメントする方法は、どちらのシナリオでも同じです。
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
本番環境リソースに切り替えるには、エミュレータに接続するための行をコメントアウトします。
Data Connect SDK のデータ型
Data Connect サーバーは、一般的な GraphQL データ 型とカスタム GraphQL データ型を表します。これらは SDK で次のように表されます。
| Data Connect 型 | Kotlin |
|---|---|
| 文字列 | 文字列 |
| Int | Int(32 ビット整数) |
| 浮動小数点数 | 倍精度浮動小数点数(64 ビット浮動小数点数) |
| ブール値 | ブール値 |
| UUID | java.util.UUID |
| 日付 | com.google.firebase.dataconnect.LocalDate(16.0.0-beta03 までは java.util.Date) |
| タイムスタンプ | com.google.firebase.Timestamp |
| Int64 | 長い |
| すべて | com.google.firebase.dataconnect.AnyValue |