Android SQLDelight (一) 配置及数据库初始化

文章目录

    SQLDelight 官方的文档有点简略,有些步骤看不懂,而网上找到的大部分文章都是跨平台的配置, 而我只想做 Android 单平台的,于是详细记录了一下配置过程。

    app build.gradle

    注意是 app 模块的 build.gradle, 而不是整个项目的 build.gradle.

    plugins {
      id "app.cash.sqldelight" version "2.0.0-alpha05"
    }
    
    sqldelight {
      databases {
        Database { // This will be the name of the generated database class.
          packageName = "com.sunzhongwei.someapp"
        }
      }
    }
    
    dependencies {
      implementation "app.cash.sqldelight:android-driver:2.0.0-alpha05"
    }
    

    新建 SQL 文件

    由 Android 视图切换到 Project 视图:

    新建目录

    app/src/main/sqldelight/com/sunzhongwei/someapp/data/
    

    注意,sqldelight 后面的路径要与 build.gradle 中配置的 packageName 对应上。然后再新建一个 data 目录即可。

    然后在这个目录下新建一个 Item.sq 文件。

    创建 sq 后缀的文件之后,Android Studio 会立即提示你安装 SQLDelight 插件。

    .sq 文件

    例如:

    CREATE TABLE `items` (
        `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        `name` TEXT NOT NULL,
    	`num` INTEGER,
        `notes` TEXT NOT NULL
    );
    
    INSERT INTO items (name, notes, num)
    VALUES ('apple', 'bed', 1);
    
    selectAll:
    SELECT * FROM items;
    

    测试

    例如,可以在 MainActivity.kt 中加入:

    class MainActivity : AppCompatActivity() {
    
        val driver: SqlDriver = AndroidSqliteDriver(Database.Schema, this, "test.db")
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
    		// ...
    
            val database = Database(driver)
            val itemQueries: ItemQueries = database.itemQueries
            println(itemQueries.selectAll().executeAsList())
        }
    
    	// ...
    }
    

    编译运行,就能在 Logcat 中看到日志了(搜索过滤 items):

    [Items(id=1, name=apple, num=1, notes=bed)]

    同时通过 App Inspection 也能看到新建的 test.db 数据库了。

    测试成功!这可比 Room 那套罗里吧嗦的玩意清爽太多了🍸

    生成的代码在哪里

    编译之后,通过 git status 是查看不到新增的 kotlin 代码文件的,因为其在 build 目录,默认被 gitignore 忽略了。

    app/build/generated/sqldelight/code/Database/debug/com/sunzhongwei/someapp/data/Items.kt
    

    目录结构

    > tree app/build/generated/sqldelight/code/Database/debug/com/sunzhongwei/someapp/
    ├── Database.kt
    ├── app
    │   └── DatabaseImpl.kt
    └── data
        ├── ItemQueries.kt
        └── Items.kt
    
    2 directories, 4 files
    

    Items.kt

    这个是根据 .sq 文件中的 SQL 建表语句自动生成的 data class 代码,类似 Room 的 Entity 定义:

    package com.sunzhongwei.someapp.`data`
    
    import kotlin.Long
    import kotlin.String
    
    public data class Items(
      public val id: Long,
      public val name: String,
      public val num: Long?,
      public val notes: String,
    )
    

    探索更多关于 SQLDelight

    📖 Android Room 替代品 SQLDelight 中文入门教程

    参考

    • https://cashapp.github.io/sqldelight/2.0.0-alpha05/android_sqlite/
    • 好不容易找到的一个使用 SQLDelight 的纯粹 Android 项目:https://github.com/TarasMazepa/github_showcase_client

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式