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

Firebase Data Connect クライアント SDK を使用すると、Firebase アプリからサーバーサイドのクエリとミューテーションを直接呼び出すことができます。Data Connect サービスにデプロイするスキーマ、クエリ、ミューテーションを設計するのと並行して、カスタム クライアント SDK を生成します。次に、この SDK のメソッドをクライアント ロジックに統合します。

別の場所でも説明しましたが、Data Connect クエリとミューテーションはクライアント コードによって送信され、サーバーで実行されるわけではないことに注意してください。代わりに、デプロイ時に Data Connect オペレーションは Cloud Functions のようにサーバーに保存されます。つまり、既存のユーザー(古いバージョンのアプリなど)を壊さないように、対応するクライアントサイドの変更をデプロイする必要があります。

そのため、Data Connect には、サーバーにデプロイされたスキーマ、クエリ、ミューテーションのプロトタイプを作成できるデベロッパー環境とツールが用意されています。また、プロトタイピング中にクライアントサイド SDK を自動的に生成します。

サービスアプリとクライアント アプリの更新を繰り返すと、サーバーサイドとクライアントサイドの両方の更新をデプロイできるようになります。

クライアント開発のワークフローとは何ですか?

スタートガイドに沿って、Data Connect の開発フロー全体を学びました。このガイドでは、スキーマから Android SDK を生成し、クライアント クエリとミューテーションを操作する方法について詳しく説明します。

要約すると、生成された Android SDK をクライアント アプリで使用するには、次の前提条件の手順を行います。

  1. Android アプリに Firebase を追加します。
  2. Gradle で Data Connect を依存関係として構成します。
  3. Kotlin シリアル化 Gradle プラグインと Gradle 依存関係を追加します。

次に、以下のリソースをご覧ください。

  1. アプリのスキーマを開発します。
  2. SDK の生成を設定します。

  3. クライアント コードを初期化してライブラリをインポートします

  4. クエリとミューテーションの呼び出しを実装します

  5. Data Connect エミュレータを設定して使用し、反復処理を行います。

Kotlin SDK を生成する

ほとんどの Firebase プロジェクトと同様に、Firebase Data Connect クライアント コードの作業はローカル プロジェクト ディレクトリで行われます。Data Connect VS Code 拡張機能と Firebase CLI は、クライアント コードの生成と管理に不可欠なローカルツールです。

SDK 生成オプションは、プロジェクトの初期化時に生成された dataconnect.yaml ファイルの複数のエントリにキー設定されています。

SDK の生成を初期化する

connector.yaml に、outputDirpackage、(ウェブ 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(platform("com.google.firebase:firebase-bom:33.16.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.yamlserviceIdlocationconnector.yamlconnectorId から自動的に生成されます。

コネクタ インスタンスを取得する

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

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 で次のように表されます。

データ接続タイプ Kotlin
文字列 文字列
Int Int(32 ビット整数)
浮動小数点数 Double(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