SqlDelight 跨平台数据库使用记录
简单记录KMP跨平台中使用SQLDelight数据过程,这里未验证IOS环境中使用,仅是记录commonMain下依赖使用及数据库升级迁移,Android环境测试通过。
简单记录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的简单记录
更多推荐




所有评论(0)