生成された Android SDK を使用する

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.yamloutputDirpackage、(ウェブ 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 ソースファイルが自動的に生成および更新されます。これは、ホット(再)読み込みワークフローで便利な機能です。

他のシナリオでは、Firebase CLI の Data Connect エミュレータを使用している場合は、.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.ktsplugins セクションに以下を追加します。

// 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.ktsdependencies セクションに以下を追加します。

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.yamlserviceIdlocationconnector.yamlconnectorId から自動的に生成されます。

コネクタ インスタンスの取得

構成オブジェクトを設定したので、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