简单记录KMP跨平台中使用SQLDelight数据过程,这里未验证IOS环境中使用,仅是记录commonMain下依赖使用及数据库升级迁移,Android环境测试通过。

一,环境配置

1,依赖项

项目中找到Gradle/libs.versions.toml文件,其中可配置需要的库及版本,目前最新版本为2.0.2。

你可以在下面链接中,查询你所需要的版本信息。SqlDelight 地址https://github.com/sqldelight/sqldelight?tab=readme-ov-file

配置如下:

[versions]
sqldelight = "2.0.2"

[libraries]
sqldelight-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" }
sqldelight-native = { module = "app.cash.sqldelight:native-driver", version.ref = "sqldelight" }
sqldelight-jvm = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqldelight" }
sqldelight-coroutines = { module = "app.cash.sqldelight:coroutines-extensions", version.ref = "sqldelight" }

[plugins]
sqlDelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" }

在shared模块的build文件中配置如下,这里按照自己项目需要配置相应平台即可:

plugins {
    alias(libs.plugins.sqlDelight)
}

androidMain.dependencies {
    implementation(libs.sqldelight.android)
}

commonMain.dependencies {
    implementation(libs.sqldelight.coroutines)
}

desktopMain.dependencies {
    implementation(libs.sqldelight.jvm)
}

iosMain.dependencies {
    implementation(libs.sqldelight.native)
}

如果遇到问题,如  Kotlin target level compiler options DSL is not available in this release! 

则在根目录的build文件中添加:

alias(libs.plugins.sqlDelight).apply(false)

2,配置数据库

当依赖完成之后,以在shared模块的build文件中配置数据了,此配置层级在kotlin中,与sourceSets同级。

    sqldelight {
        databases {
            create("AppTestDB") {
                packageName = "kmm.database.sqdata"
                verifyMigrations.set(true)
            }
        }
    }

如此,你的项目依赖配置就完成了。在配置代码中还有许多配置参数,如需要可以在下面链接中查看。 数据库配置参数链接https://sqldelight.github.io/sqldelight/2.0.2/multiplatform_sqlite/gradle/ 

3,请下载安装 SQLDelight plugin 。

二,数据库表创建

1,编写SQL脚本

在commonMain下创建文件夹sqldelight,此文件夹与kotlin同级。在sqldelight文件夹下创建目录kmm/database/sqdata,注意这里的文件目录需要与build文件中配置相对应。然后创建一个sq表格文件。

在你的sq文件中创建表,及相应的数据操作,这里的表格名称 非必须和文件名相同,根据项目需求即可。

CREATE TABLE testTable (
	id INTEGER PRIMARY KEY AUTOINCREMENT ,
	name TEXT,
	age INTEGER,
	phone TEXT,
	email TEXT
);
insertUser:
INSERT INTO testTable(id,name,age,phone,email) VALUES(?,?,?,?,?);

insertUser2:
INSERT OR IGNORE INTO testTable(name,age,phone) VALUES(?,?,?);

selectUser:
SELECT * FROM testTable;

selectById:
SELECT * FROM testTable WHERE id=:id;

deleteById:
DELETE FROM testTable WHERE id=?;

编写完成之后, build project一下即可。

在构建完成之后,会自动在shared下的build文件中生成相应的文件代码(如实体类等)

2,初始化构建及简单使用

  • 由于跨平台原因,这里的初始化需要各个平台单独处理,在commonMain中创建代码
expect class DatabaseDriverFactory {
    fun create(): SqlDriver
}
  • 在各平台分别编写其实现
// Android main
actual class DatabaseDriverFactory(private val context: Context) {
    actual fun create(): SqlDriver =
        AndroidSqliteDriver(AppTestDB.Schema, context, "DATABASE_NAME.db")
}

// iOS main
actual class DatabaseDriverFactory {
    actual fun create(): SqlDriver =
        NativeSqliteDriver(AppTestDB.Schema, "DATABASE_NAME.db")
}
  • 添加数据库的操作方法,实例如下
class ExampleDataSource(db: AppTestDB) {
    private val queries = db.testTableQueries

    fun insertToId(name: String, age: Long, phone: String,email: String) {
        queries.insertUser(null, name, age, phone, email)
    }

    fun delete(id: Long) {
        queries.deleteById(id)
    }

    fun getAll() =
        queries.selectUser().executeAsList()

}

此时即可开始使用数据库。

3,对于数据库的使用可自行加工,实例如下:

// Shared
interface AppModule {
    fun provideExampleDataSource(): ExampleDataSource
}

// Android
class AndroidAppModule(
    private val context: Context,
) : AppModule {
    private val db by lazy {
        YourDatabaseName(
            driver = DatabaseDriverFactory(context).create()
        )
    }

    fun provideExampleDataSource() = ExampleDataSource(db)
)


// iOS
class IosAppModule {
    private val db by lazy {
        YourDatabaseName(
            driver = DatabaseDriverFactory().create()
        )
    }
    
    fun provideExampleDataSource() = ExampleDataSource(db)
}

操作数据后,在APP Inspection中查看表数据

三,数据库的迁移

.sq 文件总是描述如何在空数据库中创建最新的模式。如果您的数据库当前处于较早的版本上,迁移文件将使这些数据库更新。迁移文件 .sqm 存储在sqldelight 文件夹中,与.sq 文件相同 

src
└─ main
   └─ sqdelight
      ├─ com/example/hockey
      |  ├─ Team.sq
      |  └─ Player.sq
      └─ migrations
         ├─ 1.sqm
         └─ 2.sqm

模式的第一个版本是1。迁移文件命名为 <version to upgrade from>.sqm 。要迁移到版本2,将迁移语句放在 1.sqm 。例如修改表格结构,添加数据,示例如下:

--添加列
ALTER TABLE testTable ADD COLUMN email TEXT ;

以上便是使用SQLDelight的简单记录

Logo

一站式 AI 云服务平台

更多推荐