Gradle
为了实现进一步定制,你可以使用 Gradle DSL 显式声明数据库。
SQLDelight 配置
databases
数据库容器。配置 SQLDelight 以给定名称创建每个数据库。
sqldelight {
databases {
create("MyDatabase") {
// Database configuration here.
}
}
}
sqldelight {
databases {
MyDatabase {
// Database configuration here.
}
}
}
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 = true
treatNullAsUnknownForEquality
类型: Property<Boolean>
如果设置为 true
,SQLDelight 在使用 IS
时,不会替换与可空类型值的相等比较。
默认为 false
。
treatNullAsUnknownForEquality.set(true)
treatNullAsUnknownForEquality = true
generateAsync
类型: Property<Boolean>
如果设置为 true
,SQLDelight 将生成用于异步驱动的挂起查询方法。
默认为 false
。
generateAsync.set(true)
generateAsync = true
deriveSchemaFromMigrations
类型: Property<Boolean>
如果设置为 true
,你的数据库模式将从 .sqm
文件中派生,就如同每个迁移都已应用一样。如果为 false
,你的模式在 .sq
文件中定义。
默认为 false
。
deriveSchemaFromMigrations.set(true)
deriveSchemaFromMigrations = true
模式依赖
你可以指定对另一个模块的模式依赖:
// 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 {
// Same database name
create("MyDatabase") {
package = "com.example.projectb"
}
}
}
// project-b/build.gradle
sqldelight {
databases {
// Same database name
MyDatabase {
package = "com.example.projectb"
}
}
}
如果你使用 deriveSchemaFromMigrations = true
,那么依赖此模块的每个模块也必须启用此特性。