Firebase Data Connect 客户端 SDK,您可以直接从 Firebase 应用调用服务器端查询和 变更。在设计要部署到您的 Data Connect 服务的架构、查询和变更时,您可以并行生成自定义客户端 SDK。然后,您可以将此 SDK 中的方法集成到客户端逻辑中。
正如我们在其他地方提到的,请务必注意,Data Connect查询和变更不是由客户端代码提交并在服务器上执行的。相反,部署后,Data Connect 操作会像 Cloud Functions 一样存储在 服务器上。这意味着,您需要部署相应的客户端更改,以避免影响现有用户(例如,使用旧版应用的用户)。
因此,Data Connect 为您提供了一个开发者环境和 工具,让您可以对服务器部署的架构、查询和变更进行原型设计。 它还会在您进行原型设计时自动生成客户端 SDK。
当您迭代更新服务和客户端应用后,服务器端和客户端更新都可以部署了。
什么是客户端开发工作流?
如果您已完成 开始使用,则应该已经 了解 Data Connect 的整体开发流程Data Connect。在本指南中,您将找到有关从架构生成 Android SDK 以及使用客户端查询和变更的更详细信息。
总而言之,如需在客户端应用中使用生成的 Android SDK,您需要按照以下前提条件步骤操作:
- 将 Firebase 添加到您的 Android 应用。
- 在 Gradle 中将 Data Connect 配置为依赖项。
- 添加 Kotlin Serialization Gradle 插件和 Gradle 依赖项。
然后:
- 开发应用架构。
设置 SDK 生成:
- 使用 Data Connect VS Code 扩展程序中的将 SDK 添加到应用 按钮
- 通过 更新您的
connector.yaml
设置和使用 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在 build 流水线中生成 SDK
您可以使用 Firebase CLI 在 CI/CD build 流程中生成 Data Connect SDK。
firebase dataconnect:sdk:generate设置客户端代码
将 Data Connect 合并到客户端代码中
如需设置客户端代码以使用 Data Connect 和生成的 SDK, 请先按照标准的 Firebase 设置 说明进行操作。
然后,将以下内容添加到 app/build.gradle.kts 中的 plugins 部分:
// 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.kts 中的 dependencies 部分:
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.yaml 中的 serviceId 和 location 以及 connector.yaml 中的
connectorId 生成。
获取连接器实例
现在,您已设置配置对象,接下来获取 Data Connect
连接器实例。连接器的代码将由
Data Connect模拟器生成。如果您的连接器名称为 movies,并且 Kotlin 软件包为 com.myapplication(如
connector.yaml 中所指定),则通过调用以下代码检索连接器对象:
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)
您还可以收集一个 Flow,该 Flow 仅在通过调用查询的 execute() 方法检索到新的查询结果时才会生成结果。
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 数据 类型。这些类型在 SDK 中表示如下。
| Data Connect 类型 | Kotlin |
|---|---|
| 字符串 | 字符串 |
| 整数 | 整数(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 |