使用 Web Worker 驱动器进行多平台设置
首先在你的项目中应用 Gradle 插件。
kotlin
plugins {
id("app.cash.sqldelight") version "2.1.0"
}
repositories {
google()
mavenCentral()
}
sqldelight {
databases {
create("Database") {
packageName.set("com.example")
}
}
}
groovy
plugins {
id "app.cash.sqldelight" version "2.1.0"
}
repositories {
google()
mavenCentral()
}
sqldelight {
databases {
Database { // 这将是生成的数据库类的名称。
packageName = "com.example"
}
}
}
在 src/main/sqldelight
目录下的 .sq
文件中编写你的 SQL 语句。 通常 .sq
文件中的第一条语句会创建一个表,但你也可以创建索引或设置默认内容。
sql
CREATE TABLE hockeyPlayer (
player_number INTEGER PRIMARY KEY NOT NULL,
full_name TEXT NOT NULL
);
CREATE INDEX hockeyPlayer_full_name ON hockeyPlayer(full_name);
INSERT INTO hockeyPlayer (player_number, full_name)
VALUES (15, 'Ryan Getzlaf');
从这些语句中,SQLDelight 会生成一个 Database
类及其关联的 Schema
对象,可用于创建数据库并在其上执行语句。Database
类由 generateSqlDelightInterface
Gradle 任务生成,该任务在您编辑 .sq
文件时由 SQLDelight IDE 插件自动运行,并且也是正常 Gradle 构建的一部分。
groovy
kotlin {
// The drivers needed will change depending on what platforms you target:
sourceSets.androidMain.dependencies {
implementation "app.cash.sqldelight:android-driver:2.1.0"
}
// or sourceSets.iosMain, sourceSets.windowsMain, etc.
sourceSets.nativeMain.dependencies {
implementation "app.cash.sqldelight:native-driver:2.1.0"
}
sourceSets.jvmMain.dependencies {
implementation "app.cash.sqldelight:sqlite-driver:2.1.0"
}
sourceSets.jsMain.dependencies {
implementation "app.cash.sqldelight:sqljs-driver:2.1.0"
implementation npm("sql.js", "1.6.2")
implementation devNpm("copy-webpack-plugin", "9.1.0")
}
}
创建驱动器
首先,在你的通用代码中设置创建驱动器的方式。这可以通过使用 expect
/actual
来完成,或者简单地使用一个通用接口和该接口的平台特有实现。
kotlin
expect suspend fun provideDbDriver(
schema: SqlSchema<QueryResult.AsyncValue<Unit>>
): SqlDriver
SqlSchema
接口包含一个泛型 QueryResult
类型参数,用于区分当 generateAsync
配置选项设置为 true
时生成的 Schema 代码。 某些驱动器在创建或迁移 Schema 时依赖同步行为,因此要使用异步 Schema,你可以使用 synchronous()
扩展方法来适配它,以便与同步驱动器一起使用。
kotlin
actual suspend fun provideDbDriver(
schema: SqlSchema<QueryResult.AsyncValue<Unit>>
): SqlDriver {
return WebWorkerDriver(
Worker(
js("""new URL("@cashapp/sqldelight-sqljs-worker/sqljs.worker.js", import.meta.url)""")
)
).also { schema.create(it).await() }
}
kotlin
actual suspend fun provideDbDriver(
schema: SqlSchema<QueryResult.AsyncValue<Unit>>
): SqlDriver {
return JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY)
.also { schema.create(it).await() }
}
kotlin
actual suspend fun provideDbDriver(
schema: SqlSchema<QueryResult.AsyncValue<Unit>>
): SqlDriver {
return AndroidSqliteDriver(schema.synchronous(), context, "test.db")
}
kotlin
actual suspend fun provideDbDriver(
schema: SqlSchema<QueryResult.AsyncValue<Unit>>
): SqlDriver {
return NativeSqliteDriver(schema.synchronous(), "test.db")
}