SQLDelight for Kotlin: 完整指南及示例
\n\n1. 什么是 SQLDelight 以及为什么需要它
\nSQLDelight 是一个用于 Kotlin 的库,它从 SQL 查询生成类型安全的 Kotlin 代码。它由 Cash App (Square) 公司开发,并支持 Kotlin Multiplatform (KMP),允许您在 Android、iOS、JVM、JS 和 Native 平台上使用相同的代码来处理数据库。
\nSQLDelight 的核心思想是,您在 .sq 文件中编写 SQL 查询,然后该库会自动生成与您的查询完全匹配的 Kotlin 类、接口和函数。这消除了编写样板代码来将查询结果映射到对象以及在编译时处理 SQL 注入的需要。
为什么要使用 SQLDelight?首先,它在编译时提供完整的类型检查:如果您更改了表结构,编译器会立即指出所有需要更新查询的地方。其次,它支持迁移、事务、异步查询以及多平台工作。第三,它与流行的框架集成,例如 Ktor、Koin、Dagger/Hilt 等。
\n2. 安装
\nSQLDelight 通过 Gradle 构建系统安装。对于 Kotlin Multiplatform,请在根目录的 build.gradle.kts 中添加以下插件:
// 根目录 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 匹配)。
3. 快速入门 — 最小工作示例
\n创建文件 MyDatabase.sq:
-- 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 代码中:
\nimport 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这段代码将创建表,插入两条记录并打印它们。
\n4. 主要方法/函数/类
\n\n4.1 executeAsList()
\n签名: fun <T> executeAsList(): List<T>
功能: 执行 SELECT 查询并返回结果的所有行,作为生成类型的对象列表。
\nval allPeople: List<Person> = querie