Firebase Data Connect を使ってみる

このクイックスタートでは、本番環境の SQL インスタンスを使用してアプリケーションに Firebase Data Connect を作成する方法について説明します。

Firebase コンソールで次の操作を行います。

  • Firebase プロジェクトに Firebase Data Connect を追加します。
  • Schema Assist を使用して Firebase コンソールでアプリのスキーマを作成し、デプロイします。
  • アプリ用に Cloud SQL インスタンスをプロビジョニングします。
  • Gemini Code Assist を使用して、データベースにサンプルデータを入力します。

次に、ローカル開発環境で次の操作を行います。

  • 本番環境インスタンスで動作する Visual Studio Code 拡張機能などの開発ツールを設定します。
  • ローカル環境をコンソールで作成したアセットと同期します。
  • 拡張機能ツールを使用して、アプリで使用するクエリを実装します。
  • 強力な型指定された SDK を生成し、アプリで使用します。
  • 最終的なスキーマ、クエリ、データをクラウドにデプロイします。

コンソール フロー: スキーマを設計してデータベースにデプロイする

  1. まだ作成していない場合は、Firebase プロジェクトを作成します。
    1. Firebase コンソールで [プロジェクトを追加] をクリックし、画面上の手順に沿って操作します。
  2. Firebase コンソールの Data Connect セクションに移動します。
  3. [Gemini を使ってみる] ボタンをクリックします。
  4. 表示された [スキーマ生成ツール] ワークフロー パネルで、アプリを記述して、Gemini が GraphQL スキーマの作成をサポートできるようにします。
  5. GraphQL スキーマを確認し、[アップグレードしてデプロイ] をクリックします。
  6. プロジェクトを Blaze プランにアップグレードします。これにより、Cloud SQL for PostgreSQL インスタンスを作成できます。

  7. [新しい Cloud SQL インスタンスを作成] を選択します。表示されたダイアログで、Cloud SQL for PostgreSQL データベースのロケーションと命名を選択します。

    アプリのスキーマと、そのスキーマに対応する PostgreSQL データベースがデプロイされます。

コンソール フロー: Firebase の Gemini を使用してミューテーションを作成し、データベースにデータを入力する

前の手順で、関連するエンティティ タイプで構成される Data Connect スキーマを作成して本番環境にデプロイしました。つまり、対応するテーブルを含む PostgreSQL データベースも作成されてデプロイされました。

データベースにデータを入力するには、Firebase で Gemini を使用して、自然言語入力から GraphQL ミューテーションを定義し、テーブルの 1 つを更新するクエリと、更新を確認するクエリを定義します。

  1. [データ] タブを開きます。

  2. [GraphQL の作成を支援] pen_spark アイコンをクリックし、表示されたボックスに入力します。

    例:

    Add data for three sample products to my app.
    
  3. [生成] をクリックします。ミューテーションが返されます。

  4. 出力を確認します。必要に応じて、[編集] をクリックしてプロンプトを絞り込み、[再生成] をクリックします。

  5. 次に、[挿入] をクリックして、データエディタにミューテーションを挿入します。

  6. [実行] をクリックします。

ミューテーションを実行すると、PostgreSQL データベースの該当するテーブルにデータが書き込まれます。コンソールでクエリを作成して、保存されているデータを表示できます。

  1. 前の手順を繰り返して、[GraphQL の作成を支援] pen_spark を使用してクエリを作成します。

  2. 表示されたボックスに入力します。

    例:

    Query data for all sample products in my app.
    
  3. [生成]、[実行] の順にクリックします。

ローカルフロー: 開発ツールを選択する

デプロイされたデータベースにデータが配置されたので、ローカル開発環境でスキーマとコネクタの開発を続行できます。

まず、ローカル環境を設定する必要があります。Data Connect には、開発ツールをインストールする 2 つの方法があります。

ローカルフロー: 開発環境を設定する

  1. ローカル プロジェクト用の新しいディレクトリを作成します。
  2. 作成した新しいディレクトリで次のコマンドを実行します。

      curl -sL https://firebase.tools/dataconnect | bash

    このスクリプトは、開発環境をセットアップし、ブラウザベースの IDE を起動しようとします。この IDE には、事前バンドルの VS Code 拡張機能などのツールが用意されており、スキーマの管理、アプリケーションで使用するクエリとミューテーションの定義、強力な型付けの SDK の生成に役立ちます。

alias dataconnect='curl -sL https://firebase.tools/dataconnect | bash'

ローカルフロー: プロジェクト ディレクトリを設定する

ローカル プロジェクトを設定するには、プロジェクト ディレクトリを初期化します。IDE ウィンドウの左側のパネルで Firebase アイコンをクリックして、Data Connect VS Code 拡張機能の UI を開きます。

  1. [Google でログイン] ボタンをクリックします。
  2. [Firebase プロジェクトを接続] ボタンをクリックし、コンソールで前に作成したプロジェクトを選択します。
  3. [Run firebase init] ボタンをクリックして、フローを完了します。

  4. [Start emulators] ボタンをクリックします。

ローカルフロー: ローカル環境でスキーマを見つける

前のセクションの firebase init の手順では、コンソールからローカル開発環境にデプロイしたスキーマを同期しました。

スキーマを見つけます。スキーマは、Firebase プロジェクト ディレクトリの /dataconnect/schema/schema.gql ファイルにあります。

ローカルフロー: スキーマを操作する

スキーマの例: 映画

Data Connect では、GraphQL フィールドは列にマッピングされます。Movie 型には、idtitleimageUrlgenre が含まれる可能性があります。Data Connect は、プリミティブ データ型 StringUUID を認識します。

# File `/dataconnect/schema/schema.gql`

# By default, a UUID id key will be created by default as primary key.
type Movie @table {
  id: UUID! @default(expr: "uuidV4()")
  title: String!
  imageUrl: String!
  genre: String
}

スキーマの例 1:1 テーブル: MovieMetadata

映画では、映画のメタデータをモデル化できます。

たとえば、schema.gql に次のスニペットを追加するか、Gemini によって生成されたコードを確認します。

# Movie - MovieMetadata is a one-to-one relationship
type MovieMetadata @table {
  # This time, we omit adding a primary key because
  # you can rely on Data Connect to manage it.

  # @unique indicates a 1-1 relationship
  movie: Movie! @unique
  # movieId: UUID <- this is created by the above reference
  rating: Float
  releaseYear: Int
  description: String
}

movie フィールドは Movie 型にマッピングされています。Data Connect は、これが MovieMovieMetadata の関係であることを理解し、この関係を管理します。

Data Connect スキーマの詳細については、ドキュメントをご覧ください

ローカルフロー: テーブルにデータを追加する

IDE エディタパネルでは、/dataconnect/schema/schema.gql の GraphQL 型の上に CodeLens ボタンが表示されます。コンソールの場合と同様に、ミューテーションを作成して本番環境データベースにデータを追加できます。

ローカルでテーブルにデータを追加するには:

  1. schema.gql で、いずれかの型(アプリの性質に応じて MovieProductAccount など)の宣言の上にある [データを追加] ボタンをクリックします。
    Firebase Data Connect の Code Lens の [データの追加] ボタン
  2. 新しいファイル <type>_insert.qgl が、Movie_insert.gqlProduct_insert.gql などの作業ディレクトリに追加されます。そのタイプのフィールドにデータをハードコードします。
  3. [実行(本番環境)] ボタンをクリックします。
    Firebase Data Connect の Code Lens の実行ボタン
  4. 前の手順を繰り返して、他のテーブルにレコードを追加します。

データが追加されたことをすばやく確認するには:

  1. schema.gql に戻り、型宣言の上にある [データの読み取り] ボタンをクリックします。
  2. 生成された <type>_read.gql ファイル(Product_read.gql など)で、[実行(本番環境)] ボタンをクリックしてクエリを実行します。

Data Connect ミューテーションの詳細については、ドキュメントをご覧ください

ローカルフロー: クエリを定義する

次はクエリです。デベロッパーは GraphQL クエリではなく SQL クエリの作成に慣れているため、最初は少し違和感があるかもしれません。ただし、GraphQL は、未加工の SQL よりもはるかに簡潔で型安全です。VS Code 拡張機能により、開発が容易になります。

クエリを実装するには、CodeLens で生成されたクエリを変更します。

  1. /dataconnect/schema/schema.gql で、型(MovieProductAccount など)の上で、[データを読み取る] CodeLens ボタンをクリックします。
  2. 生成された <type>_read.gql ファイルで、[実行(本番環境)] ボタンをクリックしてクエリをテストします。
  3. 機能するクエリを /dataconnect/connector/queries.gql にコピーします。
  4. このクエリをデプロイ可能にするには、一意の名前を宣言します。

    たとえば、次の汎用例では、query_nameListMoviesListProductsListAccounts のいずれかです。

# File `/dataconnect/connector/queries.gql`

# @auth() directives control who can call each operation.
query <query_name> @auth(level: PUBLIC) {
   <table_name> {
     <field_1>
     <field_2>
     <field_3>
  }
}

近くの CodeLens ボタンを使用してクエリを実行します。

Data Connect クエリの詳細については、ドキュメントをご覧ください

ローカルフロー: SDK を生成する

  1. [Add SDK to app] ボタンをクリックします。
  2. 表示されたダイアログで、アプリのコードを含むディレクトリを選択します。Data Connect SDK コードが生成され、そこに保存されます。

  3. アプリ プラットフォームを選択し、選択したディレクトリに SDK コードがすぐに生成されることを確認します。

ローカルフロー: スキーマとクエリを本番環境にデプロイする

開発の反復処理を完了しました。これで、スキーマの場合と同様に、Firebase Extensions UI または Firebase CLI を使用して、スキーマとクエリをサーバーにデプロイできます。

IDE ウィンドウの VS Code 拡張機能 UI で、[Deploy to production] ボタンをクリックします。

デプロイしたら、Firebase コンソールに移動して、スキーマの更新(該当する場合)とオペレーションがクラウドにアップロードされていることを確認します。コンソールでもスキーマを表示し、オペレーションを実行できるはずです。Cloud SQL for PostgreSQL インスタンスは、最終的にデプロイされた生成されたスキーマとデータで更新されます。

Data Connect エミュレータの使用方法については、ドキュメントをご覧ください

ローカルフロー: SDK を使用してアプリからクエリを呼び出す

更新されたスキーマ(該当する場合)とクエリが本番環境にデプロイされたので、Data Connect が生成した SDK を使用して、ListMovies クエリへの呼び出しを実装できます。

Web

  1. ウェブアプリに Firebase を追加します。
  2. React アプリのメインファイルで、次のコードを追加します。

    • 生成された SDK をインポートします。
    • Data Connect メソッドを呼び出します。
    import React from 'react';
    import ReactDOM from 'react-dom/client';
    
    // Generated queries.
    // Update as needed with the path to your generated SDK.
    import { listMovies, ListMoviesData } from '@movie-app/movies';
    
    function App() {
      const [movies, setMovies] = useState<ListMoviesData['movies']>([]);
      useEffect(() => {
        listMovies.then(res => setMovies(res.data));
      }, []);
      return (
        movies.map(movie => <h1>{movie.title}</h1>);
      );
    }
    
    const root = ReactDOM.createRoot(document.getElementById('root'));
    root.render(<App />);
    

Swift

  1. Firebase を iOS アプリに追加します。
  2. 生成された SDK を使用するには、Xcode で依存関係として構成します。

    Xcode のトップ ナビゲーション バーで、[File] > [Add Package Dependencies] > [Add Local] を選択し、生成された Package.swift を含むフォルダを選択します。

  3. アプリのメイン デリゲートで、次のコードを追加します。

    • 生成された SDK をインポートします。
    • Data Connect メソッドを呼び出します。
    import SwiftUI
    
    import FirebaseDataConnect
    // Generated queries.
    // Update as needed with the package name of your generated SDK.
    import <CONNECTOR-PACKAGE-NAME>
    
    let connector = DataConnect.moviesConnector
    
    struct ListMovieView: View {
    @StateObject private var queryRef = connector.listMovies.ref()
    
        var body: some View {
            VStack {
                Button {
                    Task {
                        do {
                            try await refresh()
                        } catch {
                            print("Failed to refresh: \(error)")
                        }
                    }
                } label: {
                    Text("Refresh")
                }
    
                // use the query results in a view
                ForEach(queryRef.data?.movies ?? []) { movie in
                        Text(movie.title)
                    }
                }
        }
        @MainActor
        func refresh() async throws {
            _ = try await queryRef.execute()
        }
    
        struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ListMovieView()
        }
    }
    

Kotlin Android

  1. Firebase を Android アプリに追加します。
  2. 生成された SDK を使用するには、Gradle で Data Connect を依存関係として構成します。

    app/build.gradle.ktspluginsdependencies を更新します。

    plugins {
      // Use whichever versions of these dependencies suit your application.
      // The versions shown here were the latest as of March 14, 2025.
      // Note, however, that the version of kotlin("plugin.serialization") must,
      // in general, match the version of kotlin("android").
      id("com.android.application") version "8.9.0"
      id("com.google.gms.google-services") version "4.4.2"
      val kotlinVersion = "2.1.10"
      kotlin("android") version kotlinVersion
      kotlin("plugin.serialization") version kotlinVersion
    }
    
    dependencies {
      // Use whichever versions of these dependencies suit your application.
      // The versions shown here were the latest versions as of March 14, 2025.
      implementation("com.google.firebase:firebase-dataconnect:16.0.0-beta04")
      implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1")
      implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3")
    
      // These dependencies are not strictly required, but will very likely be used
      // when writing modern Android applications.
      implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0")
      implementation("androidx.appcompat:appcompat:1.7.0")
      implementation("androidx.activity:activity-ktx:1.10.1")
      implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7")
      implementation("com.google.android.material:material:1.12.0")
    }
    
  3. アプリのメイン アクティビティで、次の操作を行います。

    • 生成された SDK をインポートします。
    • Data Connect メソッドを呼び出します。
    import android.os.Bundle
    import android.widget.TextView
    import androidx.appcompat.app.AppCompatActivity
    import androidx.lifecycle.Lifecycle
    import androidx.lifecycle.lifecycleScope
    import androidx.lifecycle.repeatOnLifecycle
    import kotlinx.coroutines.launch
    
    
    private val connector = com.myapplication.MoviesConnector.instance
    
    class MainActivity : AppCompatActivity() {
    
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val textView: TextView = findViewById(R.id.text_view)
    
        lifecycleScope.launch {
          lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
            
            val result = connector.listMovies.runCatching { execute { } }
            
            val newTextViewText = result.fold(
              onSuccess = {
                val titles = it.data.movies.map { it.title }
                "${titles.size} movies: " + titles.joinToString(", ")
              },
              onFailure = { "ERROR: ${it.message}" }
            )
            textView.text = newTextViewText
          }
        }
      }
    }
    

Flutter

  1. Flutter アプリに Firebase を追加します。
  2. flutterfire CLI dart pub global activate flutterfire_cli をインストールします。
  3. flutterfire configure を実行します。
  4. アプリのメイン関数で、次の操作を行います。
    • 生成された SDK をインポートします。
    • Data Connect メソッドを呼び出します。
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'firebase_options.dart';

// Generated queries.
// Update as needed with the path to your generated SDK

import 'movies_connector/movies.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  
  
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            body: Column(children: [
      ConstrainedBox(
        constraints: const BoxConstraints(maxHeight: 200),
        child: FutureBuilder(
            future: MoviesConnector.instance.listMovies().execute(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                return ListView.builder(
                  scrollDirection: Axis.vertical,
                  itemBuilder: (context, index) => Card(
                      child: Text(
                    snapshot.data!.data.movies[index].title,
                  )),
                  itemCount: snapshot.data!.data.movies.length,
                );
              }
              return const CircularProgressIndicator();
            }),
      )
    ])));
  }
}

次のステップ

デプロイされたプロジェクトを確認し、その他のツールを確認する。

  • Firebase コンソールで、データベースにデータを追加したり、スキーマを検査、変更したり、Data Connect サービスをモニタリングしたりします。

詳しくは、ドキュメントをご覧ください。たとえば、クイックスタートを完了したので、次のようにします。