简介SQLDelight 是一个跨平台的数据库,它与传统的注释处理和反射生成代码的方式完全相反 。
比起支持跨平台这一特点,SQLDelight 有一个更为重要的特点:它能够将 SQL 代码转换为 Kotlin、JAVA 或者原生代码,从而支持 Android、IOS、Web 等不同的平台 。
就算使用诸如 Room 数据库之类的传统的、平台特定的库,也可以仅用 SQL 这一门语言轻松地创建数据库表和操作 。
SQLDelight 需要开发者能自己编写 SQL 查询,这既是 SQLDelight 的优势也是它的劣势 。作为一名 Android 开发人员,我不喜欢编写除了 Kotlin/Java 以外的代码,但另一方面,它给了我支持跨平台的机会 。
但是说实话,开发者开发一个移动端应用程序时,就算对 SQL 的基础编程方法和语法了解地不深入,也可以写出 SQL 代码并运行编译 。
集成把 SQLDelight 插件添加到项目级 Gradle 文件中,如下面的代码所示:
// 顶级构建文件,可以在其中添加所有子项目/模块的通用配置选项 。buildscript {ext.kotlin_version = "1.4.32"repositories {google()jcenter()// SQLDelight 支持存储库mavenCentral()maven { url 'https://www.jetbrains.com/intellij-repository/releases' }maven { url "https://jetbrains.bintray.com/intellij-third-party-dependencies" }}dependencies {classpath "com.android.tools.build:gradle:4.1.3"classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"// SQL Delight 插件classpath 'com.squareup.sqldelight:gradle-plugin:1.5.0'}}allprojects {repositories {google()jcenter()}}task clean(type: Delete) {delete rootProject.buildDir}
第二步,需要在应用级 Gradle 文件上应用 SQLDelight 插件来支持代码生成 。SQLDelight 不会基于 kapt 这样的注释处理器来生成代码 。
生成特定平台的代码的过程之所以有效,是因为最终执行的都是 SQL 查询,在某种程度上,这与 Room 数据库等平台特定库是相似的 。看看下面的代码:
plugins {id 'com.android.Application'id 'kotlin-android'id 'com.squareup.sqldelight'}
上面的操作已经集成了通用的 SQLDelight 支持,现在需要添加 Android 支持库 —— AndroidSqliteDriver ,在依赖项节点应用程序级 Gradle 文件下添加以下代码:
implementation "com.squareup.sqldelight:android-driver:1.3.0"
编写 SQL 代码写 SQL 代码来创建数据库,首先应该定位 *.sq 文件 。在 main 目录下创建一个名为 sqldelight 的单独目录(类似于 Java 和 Kotlin 代码的文件夹),并将所有的 *.sq 文件存放其中 。
src/main/sqldelight
紧接着,创建 MovieItem.sql 文件,然后把下面的代码添加到该文件中:
【Android 开发:关于 SQLDelight 入门】CREATE TABLE moveItem (name TEXT NOT NULL UNIQUE PRIMARY KEY,image TEXT NOT NULL,rating INTEGER NOT NULL DEFAULT 0);selectAll:SELECT *FROM moveItemORDER BY name;insertOrReplace:INSERT OR REPLACE INTO moveItem (name,image,rating)VALUES (?, ?, ?);selectByName:SELECT *FROM moveItemWHERE name = ?;empty:DELETE FROM moveItem;
添加了上述代码后,将会弹出提示安装 SQLDelight Android Studio 插件 。这不是强制性的,但它可以让你更容易理解 SQL 语法 。我建议安装该插件 。
Android 代码如上文所述,我们需要用 AndroidSqliteDriver 把数据写进 Android 数据库,该数据库在应用程序启动期间持续存在 。首先,创建 AndroidSqliteDriver 实例:
val androidSqlDriver = AndroidSqliteDriver(schema = Database.Schema,context = applicationContext,name = "movies.db")
接着,需要获取在 MovieItem.sql 文件中创建的查询语句 。代码如下:
val queries = Database(androidSqlDriver).movieItemQueries
然后,直接执行 MovieItem.sql 文件中的 selectAll 函数,代码如下:
val movies: List = queries.selectAll().executeAsList()Log.d("MovieDatabase", "Movies : $movies")
协程支持Room 库成功背后的主要原因之一是它易于使用,而且与 coroutines 和 paging 等流行框架相兼容 。
SQLDelight 也有这个好处;我们只需要在应用程序级别的 Gradle 文件的 dependencies 节点下添加以下这行代码就可以了:
implementation "com.squareup.sqldelight:coroutines-extensions-jvm:1.5.0"
现在就像在 Room 库中使用协程一样简单 。代码如下:
val players: Flow<List<MoveItem>> =queries.selectAll().asFlow().mapToList()
如果你仍在使用 RxJava,那么你可以添加下面这行代码,以便将 RxJava 支持集成到 SQLDelight 中:
推荐阅读
- OCaml 开发工具配置
- 如何用python获取收益
- 一个开箱即用的中后台前端框架,基于vue3+vite2开发
- 关于日出日落的诗句,描写日出日落的古诗句-
- 关于马超的三国故事,三国演义中马超的故事情节-
- 你知道哪些有关清明节的古诗,还有什么关于清明节的古诗-
- 减肥不吃早饭会胖吗 关于减肥的饮食
- 小女孩皮肤粗糙什么原因,小女孩皮肤特别粗糙-
- 宁王朱权后代如何篡位,关于朱棣起兵时和宁王的关系-
- 春节的古诗 !,关于春节的几首古诗-