SQLDelight for Kotlin: 完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程
\n

SQLDelight for Kotlin: 完整指南及示例

\n\n
\n

1. 什么是 SQLDelight 以及为什么需要它

\n

SQLDelight 是一个用于 Kotlin 的库,它从 SQL 查询生成类型安全的 Kotlin 代码。它由 Cash App (Square) 公司开发,并支持 Kotlin Multiplatform (KMP),允许您在 Android、iOS、JVM、JS 和 Native 平台上使用相同的代码来处理数据库。

\n

SQLDelight 的核心思想是,您在 .sq 文件中编写 SQL 查询,然后该库会自动生成与您的查询完全匹配的 Kotlin 类、接口和函数。这消除了编写样板代码来将查询结果映射到对象以及在编译时处理 SQL 注入的需要。

\n

为什么要使用 SQLDelight?首先,它在编译时提供完整的类型检查:如果您更改了表结构,编译器会立即指出所有需要更新查询的地方。其次,它支持迁移、事务、异步查询以及多平台工作。第三,它与流行的框架集成,例如 Ktor、Koin、Dagger/Hilt 等。

\n
\n\n
\n

2. 安装

\n

SQLDelight 通过 Gradle 构建系统安装。对于 Kotlin Multiplatform,请在根目录的 build.gradle.kts 中添加以下插件:

\n
// 根目录 build.gradle.kts\nplugins {\n    id("app.cash.sqldelight") version "2.0.2" apply false\n}\n\n// 在模块中 (例如 :shared)\nplugins {\n    id("app.cash.sqldelight")\n}\n\nsqldelight {\n    databases {\n        create("MyDatabase") {\n            packageName.set("com.example.db")\n        }\n    }\n}\n\ndependencies {\n    implementation("app.cash.sqldelight:coroutines-extensions:2.0.2")\n    implementation("app.cash.sqldelight:runtime:2.0.2")\n    // 对于 Android\n    implementation("app.cash.sqldelight:android-driver:2.0.2")\n    // 对于 iOS\n    implementation("app.cash.sqldelight:native-driver:2.0.2")\n    // 对于 JVM\n    implementation("app.cash.sqldelight:sqlite-driver:2.0.2")\n}\n
\n

同步 Gradle 后,创建文件 src/commonMain/sqldelight/com/example/db/MyDatabase.sq(路径必须与 packageName 匹配)。

\n
\n\n
\n

3. 快速入门 — 最小工作示例

\n

创建文件 MyDatabase.sq:

\n
-- MyDatabase.sq\nCREATE TABLE Person (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    name TEXT NOT NULL,\n    age INTEGER NOT NULL\n);\n\nselectAll:\nSELECT * FROM Person;\n\ninsertPerson:\nINSERT INTO Person(name, age) VALUES (?, ?);\n
\n

现在在 Kotlin 代码中:

\n
import com.example.db.MyDatabase\nimport app.cash.sqldelight.db.SqlDriver\nimport app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver\n\nfun main() {\n    val driver: SqlDriver = JdbcSqliteDriver("jdbc:sqlite:test.db")\n    MyDatabase.Schema.create(driver)\n    \n    val database = MyDatabase(driver)\n    val queries = database.myDatabaseQueries\n    \n    // 插入\n    queries.insertPerson("Alice", 30)\n    queries.insertPerson("Bob", 25)\n    \n    // 查询\n    val people = queries.selectAll().executeAsList()\n    people.forEach { person ->\n        println("${person.name} is ${person.age} years old")\n    }\n}\n
\n

这段代码将创建表,插入两条记录并打印它们。

\n
\n\n
\n

4. 主要方法/函数/类

\n\n

4.1 executeAsList()

\n

签名: fun <T> executeAsList(): List<T>

\n

功能: 执行 SELECT 查询并返回结果的所有行,作为生成类型的对象列表。

\n
val allPeople: List<Person> = querie                    

推荐