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

更新日期: 2023-05-26 阅读次数: 1041 字数: 562 分类: Android

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

tags: sqldelight

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式