Firebase Data Connect 用戶端 SDK 可讓您直接從 Firebase 應用程式呼叫伺服器端查詢和變動。設計要部署至 Data Connect 服務的結構定義、查詢和變動時,您會同時產生自訂用戶端 SDK。然後將這個 SDK 的方法整合至用戶端邏輯。
如我們在其他地方所述,請務必注意,Data Connect 查詢和突變不會由用戶端程式碼提交,而是在伺服器上執行。而是部署後,Data Connect 作業會儲存在伺服器上,例如 Cloud Functions。也就是說,您需要部署對應的用戶端變更,避免現有使用者 (例如使用舊版應用程式) 無法正常運作。
因此 Data Connect 提供開發人員環境和工具,方便您製作伺服器部署的結構定義、查詢和變動原型。此外,在您製作原型時,系統也會自動產生用戶端 SDK。
完成服務和用戶端應用程式的更新疊代後,即可部署伺服器端和用戶端更新。
什麼是用戶端開發工作流程?
如果您已按照「開始使用」一文的說明操作,應該已瞭解 Data Connect 的整體開發流程。本指南會詳細說明如何從結構定義產生 Android SDK,以及如何處理用戶端查詢和變動。
總而言之,如要在用戶端應用程式中使用產生的 Android SDK,請先完成下列必要步驟:
- 將 Firebase 新增至 Android 應用程式。
- 在 Gradle 中將 Data Connect 設定為依附元件。
- 新增 Kotlin 序列化 Gradle 外掛程式和 Gradle 依附元件。
接著:
- 開發應用程式結構定義。
設定 SDK 產生作業:
- 使用 Data Connect VS Code 擴充功能的「Add SDK to app」(將 SDK 新增至應用程式) 按鈕
- 更新
connector.yaml
設定及使用 Data Connect 模擬器,然後疊代。
產生 Kotlin SDK
與大多數 Firebase 專案一樣,您會在專案的本機目錄中處理Firebase Data Connect用戶端程式碼。Data Connect VS Code 擴充功能和 Firebase CLI 都是重要的本機工具,可產生及管理用戶端程式碼。
SDK 生成選項會對應到您初始化專案時生成的 dataconnect.yaml
檔案中的多個項目。
初始化 SDK 生成作業
在connector.yaml
中,加入 outputDir
、package
和 (適用於網頁 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 來源檔案。在熱重載工作流程中,這項功能相當實用。
.gql
更新,並自動更新 SDK 來源。
或者,您也可以在 .gql 檔案變更時,使用 CLI 重新產生 SDK:
firebase dataconnect:sdk:generate --watch
產生 SDK,用於整合及發布正式版
在某些情況下 (例如準備專案來源以提交 CI 測試時),您可以呼叫 Firebase CLI 進行批次更新。
在這些情況下,請使用 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: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 時所用的資訊,初始化 Data Connect 執行個體 (所有資訊都可在 Firebase 控制台的「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
,只有在透過呼叫查詢的 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
製作原型並測試 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 中的表示方式如下。
資料連結類型 | Kotlin |
---|---|
字串 | 字串 |
整數值 | 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 |