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

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 をクライアント アプリで使用するには、次の前提条件を満たす必要があります。

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

その後の操作は次のとおりです。

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

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

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

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

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.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: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.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

列挙型フィールドの変更を処理する

アプリのスキーマには列挙型を含めることができ、 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