KC Blog

【Compose Multiplatform】手機資料庫SqlDelight實作

3 min read
CrossPlatform#CMP#Kotlin#SqlDelight

前言

在 Compose Multiplatform 專案中

如何實現跨平台的資料庫操作呢?

SqlDelight 提供了一個強大的解決方案

本文將介紹如何在跨平台環境中

使用 SqlDelight 進行資料庫操作

{% include table/compose-multiplatform-category.html %}

實作步驟

1. 導入 SqlDelight
首先,在專案中導入 SqlDelight:

在 .toml 文件中添加:

在 build.gradle.kts 中添加插件和依賴:

  • 首先加入plugin
  • 接著在各環境下加入對應的lib
  • 最後在kotlin下面加入sqlDelight的配置

可以理解為在test.your.package.db package下會幫你建立一個AppDatabase的可操作class

2. 實作資料表
- 在 commonMain/`sqldelight`/database 目錄下創建 .sq 文件:

當前版本我實測 需要在上述路徑加入sqldelight folder 然後下一步驟Build時候才會成功產生可操作的class 截圖 2024-07-09 下午3.11.59.png

  • (Optional)可下載同名插件SqlDelight,使其能右鍵產生.sq檔(至Marketplace下載即可)

參考 sqldelight

截圖 2024-07-09 下午3.11.59.png

  • 如上所述當上面配置完 加上Build之後

    此路徑/build/generated/sqldelight/code/.. 會產生對應的class

  • 或可以用 cmd來Build

    ./gradlew generateCommonMainAppDatabaseInterface

  • 如果遇到ios build失敗可以把build.gradle.kts的 isStatic改成false

3. 建立各平台實作
為不同平台創建 DatabaseDriverFactory:
4. 實際使用
使用生成的DB class 實作業務邏輯:
5. Koin 注入(Optional)
如果使用 Koin 進行依賴注入

可以這麼做

注意事項

  1. 建議使用 SqlDelight 2.0.1 版本,避免2.0.0版本IOS Build失敗的已知問題

詳細可看此討論串:點此

  1. 如果遇到 iOS 構建失敗,可以嘗試將 isStatic 設置為 false

找不到為何要這樣改

可能是官方的workaround

官方文件就直接寫出這個方法

總結

  • SqlDelight 提供了強大的跨平台資料庫解決方案
  • 通過適當的封裝,可以在不同平台上統一使用資料庫 API
  • 結合 Koin 等依賴注入框架,可以更好地管理資料庫實例
  • 注意版本選擇和平台特定實現,以確保跨平台兼容性