Firebase Data Connect クライアント SDK を使用すると、Firebase アプリからサーバーサイドのクエリとミューテーションを直接呼び出すことができます。Data Connect サービスにデプロイするスキーマ、クエリ、ミューテーションを設計するときに、カスタム クライアント SDK を並行して生成します。次に、この SDK のメソッドをクライアント ロジックに統合します。
他の場所でも説明したように、Data Connect クエリとミューテーションはクライアント コードによって送信されず、サーバーで実行されることに注意してください。代わりに、デプロイ時に Data Connect オペレーションは Cloud Functions のようにサーバーに保存されます。つまり、既存のユーザー(古いアプリ バージョンなど)に影響しないように、対応するクライアントサイドの変更をデプロイする必要があります。
そのため、Data Connect には、サーバー デプロイされたスキーマ、クエリ、ミューテーションのプロトタイプを作成できるデベロッパー環境とツールが用意されています。また、プロトタイプ作成中にクライアントサイド SDK を自動的に生成します。
サービスとクライアント アプリの更新を反復処理すると、サーバーサイドとクライアントサイドの両方の更新をデプロイする準備が整います。
Kotlin SDK を生成する
ほとんどの Firebase プロジェクトと同様に、Firebase Data Connect クライアント コードの作業はローカル プロジェクト ディレクトリで行います。Data Connect VS Code 拡張機能と Firebase CLI はどちらも、クライアント コードの生成と管理に重要なローカル ツールです。
SDK 生成オプションは、プロジェクトの初期化時に生成された dataconnect.yaml
ファイル内の複数のエントリにキーが設定されています。
SDK 生成を初期化する
connector.yaml
に outputDir
、package
、(ウェブ SDK の場合は)packageJsonDir
を追加します。connectorId: movies
generate:
kotlinSdk:
outputDir: ../../../src/main/java/com/myapplication
package: com.myapplication
outputDir
は、生成されたコードを配置するディレクトリのパスに置き換えます。このパスは、connector.yaml
ファイル自体を含むディレクトリを基準とした相対パスです。package
は、生成されたファイルで使用する Kotlin パッケージ ステートメントに置き換えます。または、package
を省略してデフォルト パッケージを使用します。
プロトタイプ作成中に SDK を更新する
Data Connect VS Code 拡張機能とその Data Connect エミュレータを使用してインタラクティブにプロトタイピングする場合、スキーマ、クエリ、ミューテーションを定義する .gql
ファイルを変更すると、SDK ソースファイルが自動的に生成および更新されます。これは、ホット(再)読み込みワークフローで便利な機能です。
.gql
の更新にウォッチを設定し、SDK ソースを自動的に更新することもできます。
または、CLI を使用して、.gql ファイルが変更されるたびに SDK を再生成することもできます。
firebase dataconnect:sdk:generate --watch
統合と本番環境リリース用の SDK を生成する
CI テストに送信するプロジェクト ソースを準備する場合など、Firebase CLI を呼び出してバッチ更新を行うことができます。
このような場合は、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("com.google.firebase:firebase-dataconnect:16.0.0-beta01")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1")
implementation("com.google.firebase:firebase-auth:23.1.0") // Optional
implementation("com.google.firebase:firebase-appcheck:18.0.0") // Optional
Data Connect Android SDK を初期化する
Data Connect の設定に使用した情報を使用して Data Connect インスタンスを初期化します(すべて Firebase コンソールの [Data Connect] タブで確認できます)。
ConnectorConfig オブジェクト
SDK にはコネクタ構成オブジェクトが必要です。
このオブジェクトは、dataconnect.yaml
の serviceId
と location
、connector.yaml
の connectorId
から自動的に生成されます。
コネクタ インスタンスの取得
構成オブジェクトを設定したので、Data Connect コネクタ インスタンスを取得します。コネクタのコードは、Data Connect エミュレータによって生成されます。コネクタ名が movies
で、Kotlin パッケージが com.myapplication
の場合(connector.yaml
で指定されているように)、次を呼び出してコネクタ オブジェクトを取得します。
val connector = com.myapplication.MoviesConnector.instance
クエリとミューテーションを実行する
コネクタ オブジェクトを使用すると、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
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 |
日付 | java.util.Date |
タイムスタンプ | com.google.firebase.Timestamp |
Int64 | 長い |
すべて | com.google.firebase.dataconnect.AnyValue |