Firebase Data Connect 使用入门

在本快速入门中,您将学习如何使用生产 SQL 实例在应用中构建 Firebase Data Connect

Firebase 控制台中,您将:

  • Firebase Data Connect 添加到您的 Firebase 项目。
  • Firebase 控制台中,使用 AI 辅助的架构生成功能为应用创建架构,然后部署该架构。
  • 为应用预配 Cloud SQL 实例。
  • 借助 Gemini in Firebase,使用示例数据填充数据库。
  • 创建查询和突变,并借助 AI 辅助生成操作,您可以部署这些操作并使用它们在本地开发客户端代码。

然后,在本地开发环境中,您将:

  • 设置开发工具,包括用于处理生产实例的 Visual Studio Code 扩展程序。
  • 将本地环境与您在控制台中创建的资源同步。
  • 生成强类型 SDK 并在应用中使用它们。

控制台流程:使用 AI 辅助功能设计架构,然后将其部署到数据库

  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 数据库。

控制台流程:使用 AI 辅助功能为客户创建运营

部署架构后,您可以采取第一步措施,通过创建查询和突变的连接器来部署到后端,并稍后从客户端调用,从而使客户端应用可以访问这些数据。

我们的 AI 辅助工具可随时为您提供帮助。

  1. 出现提示时,点击使用 Gemini 生成操作按钮。

  2. 片刻之后,在显示的生成操作工作流面板中,查看 Gemini 根据您的架构提供的查询和突变列表。

  3. 点击每个操作行,查看定义相应操作的 GraphQL 代码。如有必要,请使用回收站控件删除不需要的操作。

  4. 如需添加操作,请点击 + 添加按钮。然后:

    1. 用自然语言描述您的操作。

      例如:

      List all products
      
    2. 查看生成的 GraphQL。

    3. 如果该操作可以接受,请点击插入将其添加到您的操作列表中。

  5. 继续移除和添加操作,直到您的操作集可以接受为止。

  6. 如需将此操作列表部署为可供客户端调用的连接器集,请选择连接器的名称,然后点击部署

控制台流程:使用 Gemini in Firebase 创建突变并填充数据库

完成上述步骤后,您创建了一个包含相关实体类型的 Data Connect schema,并将其部署到生产环境,这意味着系统还创建并部署了一个包含相应的 PostgreSQL 数据库。

如需填充数据库,您可以使用 Firebase 中的 Gemini,将自然语言输入转换为 GraphQL mutation 来更新某个表,并转换为 query 来确认更新。

  1. 打开数据标签页。

  2. 点击帮我写 GraphQL pen_spark 图标,然后在随即显示的框中输入内容。

    例如:

    Add data for three sample products to my app.
    
  3. 点击生成。返回相应变异。

  4. 查看输出。如有需要,请点击修改以优化提示,然后点击重新生成

  5. 接下来,点击插入,将变异插入到数据编辑器中。

  6. 点击运行

运行 mutation 时,数据会写入 PostgreSQL 数据库中的相应表。您可以在控制台中创建查询,以查看存储的数据:

  1. 使用帮我写 GraphQL pen_spark 重复执行上述步骤,以创建查询。

  2. 在随即显示的方框中,输入您的内容。

    例如:

    Query data for all sample products in my app.
    
  3. 点击生成,然后点击运行

本地流程:选择开发工具

现在,您已在已部署的数据库中添加了数据,并已部署连接器,接下来可以在本地开发环境中继续开发架构和连接器。

首先,您需要设置本地环境。Data Connect 为您提供了两种安装开发工具的方式。

前提条件

如需使用本快速入门,您需要满足以下条件。

本地流程:设置开发环境

  1. 为本地项目创建新目录。
  2. 在新目录中打开 VS Code。
  3. Visual Studio Code Marketplace 安装 Firebase Data Connect 扩展程序。

本地流程:设置本地项目

如需设置本地项目,请初始化项目目录。在 IDE 窗口的左侧面板中,点击 Firebase 图标以打开 Data Connect VS Code 扩展程序界面:

  1. 点击使用 Google 账号登录按钮。
  2. 点击关联 Firebase 项目按钮,然后在控制台中选择您之前创建的项目。
  3. 点击 Run firebase init 按钮,然后完成相应流程。

  1. 点击启动模拟器按钮。

本地流程:在本地环境中查找架构和连接器

上一部分中的 firebase init 步骤会将资源同步到您的本地开发环境:
  • 它会同步您部署的架构
    • 找到您的架构:它位于 Firebase 项目目录的 /dataconnect/schema/schema.gql 文件中。
  • 它会同步您部署的连接器中的查询和变更
    • 找到您的连接器:操作位于 Firebase 项目目录的 /dataconnect/connector/ 目录中。

本地流程:了解您的架构

架构示例:电影

Data Connect 中,GraphQL 字段会映射到列。Movie 类型可能具有 idtitleimageUrlgenreData 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. 系统会在您的工作目录(例如 Movie_insert.gqlProduct_insert.gql)中添加一个新文件 <type>_insert.qgl。对相应类型的字段中的数据进行硬编码。
  3. 点击运行(正式版)按钮。
    Firebase Data Connect 的 Code Lens“运行”按钮
  4. 重复上述步骤,将记录添加到其他表格。

如需快速验证数据是否已添加,请执行以下操作:

  1. 返回到 schema.gql,点击类型声明上方的 Read data 按钮。
  2. 在生成的 <type>_read.gql 文件(例如 Product_read.gql)中,点击运行(生产)按钮以执行查询。

在文档中详细了解 Data Connect 突变

本地流程:生成 SDK

您的架构和连接器操作已在本地同步。

现在,您可以使用 VS Code 扩展程序生成客户端 SDK,开始在 iOS、Android、Web 和 Flutter 应用中实现对查询和突变的调用。

  1. 在扩展程序界面中,点击向应用添加 SDK 按钮。
  2. 在随即显示的对话框中,选择包含应用代码的目录。Data Connect系统会生成 SDK 代码并将其保存到该目录中。

  3. 选择应用平台,然后注意,系统会立即在所选目录中生成 SDK 代码。

本地流程:使用 SDK 从应用中调用查询

之前,您已在 Firebase 控制台中部署了架构和操作。 如需从应用中调用操作,您可以使用 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.kts 中的 pluginsdependencies

    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. 在应用的主 activity 中:

    • 导入生成的 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. 将 Firebase 添加到您的 Flutter 应用。
  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 服务。

如需了解详情,请参阅相关文档。例如,由于您已完成快速入门: