Gradle
为了实现更高的自定义程度,您可以使用 Gradle DSL 显式声明数据库。
SQLDelight 配置
databases
数据库容器。配置 SQLDelight 以使用指定名称创建每个数据库。
sqldelight {
databases {
create("MyDatabase") {
// 在此处配置数据库。
}
}
}sqldelight {
databases {
MyDatabase {
// 在此处配置数据库。
}
}
}linkSqlite
类型:Property<Boolean>
用于原生目标。是否应自动链接 sqlite。 当项目编译为动态框架(这是最近 KMP 版本中的默认设置)时,这会添加用于链接 sqlite 的必要元数据。
请注意,对于静态框架,此标志无效。 导入该项目的 XCode 构建应将 -lsqlite3 添加到链接器标志中。 或者通过 cocoapods 插件添加项目依赖项到 sqlite3 pod。 另一个可能奏效的选择是将 sqlite3 添加到 cocoapods spec.libraries 设置中,例如在 Gradle Kotlin DSL 中:extraSpecAttributes["libraries"] = "'c++', 'sqlite3'"。
默认为 true。
linkSqlite.set(true)linkSqlite = true数据库配置
packageName
类型:Property<String>
用于数据库类的包名。
packageName.set("com.example.db")packageName = "com.example.db"srcDirs
类型:ConfigurableFileCollection
插件将在其中查找 .sq 和 .sqm 文件的文件夹集合。
默认为 src/[prefix]main/sqldelight,其中前缀取决于所应用的 kotlin 插件,例如多平台对应的 common。
srcDirs.setFrom("src/main/sqldelight")srcDirs = ['src/main/sqldelight']srcDirs(vararg objects: Any)
插件将在其中查找 .sq 和 .sqm 文件的对象集合。
srcDirs("src/main/sqldelight", "main/sqldelight")srcDirs('src/main/sqldelight', 'main/sqldelight')schemaOutputDirectory
类型:DirectoryProperty
存储 .db 架构文件的目录,相对于项目根目录。 这些文件用于验证迁移生成的数据库是否具有最新的架构。
默认为 null。
如果为 null,则不会创建迁移验证任务。
schemaOutputDirectory.set(file("src/main/sqldelight/databases"))schemaOutputDirectory = file("src/main/sqldelight/databases")dependency
类型:Project
(可选)指定对其他 gradle 项目的架构依赖项(见下文)。
dependency(project(":other-project"))dependency project(":other-project")dialect
类型:String 或 Provider<MinimalExternalModuleDependency>
您想要针对的 SQL 方言。方言通过 gradle 依赖项进行选择。 这些依赖项可以指定为 app.cash.sqldelight:{dialect module}:2.1.0。 有关可用方言,请参见下文。
对于 Android 项目,SQLite 版本会根据您的 minSdk 自动选择。 否则默认为 SQLite 3.18。
可用方言:
- HSQL:
hsql-dialect - MySQL:
mysql-dialect - PostgreSQL:
postgresql-dialect - SQLite 3.18:
sqlite-3-18-dialect - SQLite 3.24:
sqlite-3-24-dialect - SQLite 3.25:
sqlite-3-25-dialect - SQLite 3.30:
sqlite-3-30-dialect - SQLite 3.33:
sqlite-3-33-dialect - SQLite 3.35:
sqlite-3-35-dialect - SQLite 3.38:
sqlite-3-38-dialect
dialect("app.cash.sqldelight:sqlite-3-24-dialect:2.1.0")dialect 'app.cash.sqldelight:sqlite-3-24-dialect:2.1.0'verifyMigrations
类型:Property<Boolean>
如果设置为 true,在构建过程中如果迁移文件中存在任何错误,构建将失败。
默认为 false。
verifyMigrations.set(true)verifyMigrations = truetreatNullAsUnknownForEquality
类型:Property<Boolean>
如果设置为 true,在使用 IS 时,SQLDelight 不会替换为可为 null 类型值的相等性比较。
默认为 false。
treatNullAsUnknownForEquality.set(true)treatNullAsUnknownForEquality = truegenerateAsync
类型:Property<Boolean>
如果设置为 true,SQLDelight 将生成挂起查询方法,以便与异步驱动程序一起使用。
默认为 false。
generateAsync.set(true)generateAsync = truederiveSchemaFromMigrations
类型:Property<Boolean>
如果设置为 true,数据库的架构将从您的 .sqm 文件派生,就像已应用了每次迁移一样。 如果为 false,您的架构将在 .sq 文件中定义。
默认为 false。
deriveSchemaFromMigrations.set(true)deriveSchemaFromMigrations = trueexpandSelectStar
类型:Property<Boolean>
如果设置为 true,SQLDelight 将重写 SELECT * 语句以显式引用每个实际的结果列。
例如,下方的 getAll 查询
CREATE TABLE hockey_player (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
number INTEGER NOT NULL
);
getAll:
SELECT * FROM hockey_player;将被重写为 SELECT hockey_player.id, hockey_player.name, hockey_player.number FROM hockey_player;。
默认为 true。
expandSelectStar.set(true)expandSelectStar = truecodegenExcludedColumns
类型:SetProperty<String>
一组 table.column 值,用于从生成的模型和扩展的 SELECT * 投影中省略这些列。表名和列名必须使用与 SQLDelight 架构源相同的大小写。这仅影响代码生成;不会更改 SQL 架构或生成的迁移输出。
这可用于在后续架构迁移删除列之前更新生成的 Kotlin API。如果配置的表或列不存在,或者模型绑定的 insert、SELECT 结果列或 RETURNING 子句显式列出了排除在代码生成之外的列,SQLDelight 将编译失败。由于这仅限代码生成,应用程序负责确保在删除任何仍然存在的排除列之前,可以从写入操作中省略这些列,例如通过使用可为 null 的列或默认值。
如果您的 .sq 文件包含 CREATE TABLE 架构定义,请在物理架构迁移删除该列之前,将排除的列保留在架构定义中。移除对该列的显式查询引用,但保留反映当前数据库形态的架构源。
默认为空。
codegenExcludedColumns.set(setOf("hockey_player.number"))codegenExcludedColumns = ["hockey_player.number"]架构依赖项
您可以指定对另一个模块的架构依赖项:
// project-a/build.gradle.kts
sqldelight {
databases {
create("MyDatabase") {
packageName.set("com.example.projecta")
dependency(project(":ProjectB"))
}
}
}// project-a/build.gradle
sqldelight {
databases {
MyDatabase {
packageName = "com.example.projecta"
dependency project(":ProjectB")
}
}
}这会在 ProjectB 中查找 MyDatabase,并在编译时将其架构包含在内。为了使其正常工作,ProjectB 必须拥有一个同名的数据库(在本例中为 MyDatabase),但要在不同的软件包中生成。以下是 ProjectB 的 Gradle 构建配置示例:
// project-b/build.gradle.kts
sqldelight {
databases {
// 相同的数据库名称
create("MyDatabase") {
package = "com.example.projectb"
}
}
}// project-b/build.gradle
sqldelight {
databases {
// 相同的数据库名称
MyDatabase {
package = "com.example.projectb"
}
}
}如果您使用 deriveSchemaFromMigrations = true,则依赖于该模块的每个模块也必须启用此功能。
