您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

Android 开发:关于 SQLDelight 入门

时间:2022-06-21 14:59:11  来源:  作者:Android攻城狮狮狮

简介

SQLDelight 是一个跨平台的数据库,它与传统的注释处理和反射生成代码的方式完全相反。

比起支持跨平台这一特点,SQLDelight 有一个更为重要的特点:它能够将 SQL 代码转换为 Kotlin、JAVA 或者原生代码,从而支持 AndroidIOS、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 文件,然后把下面的代码添加到该文件中:

CREATE TABLE moveItem (
    name TEXT NOT NULL UNIQUE PRIMARY KEY,
    image TEXT NOT NULL,
    rating INTEGER NOT NULL DEFAULT 0
);

selectAll:
SELECT *
FROM moveItem
ORDER BY name;

insertOrReplace:
INSERT OR REPLACE INTO moveItem (
  name,
  image,
  rating
)
VALUES (?, ?, ?);

selectByName:
SELECT *
FROM moveItem
WHERE 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 中:

implementation "com.squareup.sqldelight:rxjava3-extensions:1.5.0"

现在来观察这个查询,我们可以使用 RxJava 扩展构件,如下所示:

val players: Flow<List<MoveItem>> = 
  queries.selectAll()
    .asObservable()
    .mapToList()

这就是目前的全部内容,希望你能有所收获。

作者:披着狼皮的羊_
链接:
https://juejin.cn/post/7111246458895990792



Tags:SQLDelight   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Android 开发:关于 SQLDelight 入门
简介SQLDelight 是一个跨平台的数据库,它与传统的注释处理和反射生成代码的方式完全相反。比起支持跨平台这一特点,SQLDelight 有一个更为重要的特点:它能够将 SQL 代码转换为...【详细内容】
2022-06-21  Search: SQLDelight  点击:(655)  评论:(0)  加入收藏
▌简易百科推荐
Android Emulator黑屏怎么办 Android模拟器黑屏解决方法
Android Emulator黑屏问题困扰了非常多的玩家,Android Emulator作为一款安卓模拟器,可以让你在电脑上运行和浏览安卓应用程序,但是程序本身不是很稳定,很容易会出现黑屏,启动不了...【详细内容】
2024-03-04  18183游戏网    Tags:Android Emulator   点击:(46)  评论:(0)  加入收藏
Android开发中常见的Hook技术有哪些?
Hook技术介绍Hook技术是一种在软件开发中常见的技术,它允许开发者在特定的事件发生时插入自定义的代码逻辑。常见的应用场景包括在函数调用前后执行特定的操作,或者在特定的事...【详细内容】
2023-12-25  沐雨花飞蝶  微信公众号  Tags:Android   点击:(91)  评论:(0)  加入收藏
在Android应用开发中使用NFC功能
NFC介绍NFC是指“近场通讯”(Near Field Communication),它是一种短距离无线通信技术,允许设备在非接触或极短距离内进行通信。NFC通常用于移动支付、门禁系统、智能标签和其他...【详细内容】
2023-12-22  沐雨花飞蝶  微信公众号  Tags:Android   点击:(104)  评论:(0)  加入收藏
关于Android图像Bitmap类,你要知道的一切
Bitmap介绍Bitmap是一种图像文件格式,它由像素阵列组成,每个像素都有自己的颜色信息。在计算机图形学中,Bitmap图像可以被描述为一个二维的矩阵,其中每个元素代表一个像素的颜色...【详细内容】
2023-12-19  沐雨花飞蝶  微信公众号  Tags:Android   点击:(102)  评论:(0)  加入收藏
Android开发中如何进行单元测试?
单元测试介绍单元测试是软件开发中的一种测试方法,用于验证代码中的最小可测试单元(通常是函数或方法)是否按预期工作。单元测试通常由开发人员编写,旨在隔离和测试代码的特定部...【详细内容】
2023-12-11  沐雨花飞蝶  微信公众号  Tags:Android   点击:(170)  评论:(0)  加入收藏
一篇聊聊Jetpack Room实现数据存储持久性
Room介绍Room 是 Android Jetpack 组件库中的一部分,它是用于在 Android 应用中进行本地数据库访问和管理的库。Room 提供了一个抽象层,使开发者能够更轻松地访问 SQLite 数据...【详细内容】
2023-12-08  沐雨花飞蝶  微信公众号  Tags:Jetpack   点击:(149)  评论:(0)  加入收藏
了解Android系统架构中的HAL硬件抽象层
在Android系统中,HAL的存在使得不同厂商的硬件可以统一被上层的应用程序调用,从而提高了系统的兼容性和可移植性。HAL还可以帮助开发者更方便地开发应用程序,因为他们不需要为...【详细内容】
2023-12-06  沐雨花飞蝶  微信公众号  Tags:Android   点击:(212)  评论:(0)  加入收藏
我们一起聊聊 IntentService 与 Service 的区别?
Service介绍Service组件是Android应用开发中的四大组件之一,用于在后台执行长时间运行的操作或处理远程请求。它可以在没有用户界面的情况下执行任务,并且可以与其他应用组件...【详细内容】
2023-12-06  沐雨花飞蝶  微信公众号  Tags:IntentService   点击:(178)  评论:(0)  加入收藏
Android数据对象序列化原理与应用
序列化与反序列化「序列化」是将对象转换为可以存储或传输的格式的过程。在计算机科学中,对象通常是指内存中的数据结构,如数组、列表、字典等。通过序列化,可以将这些对象转换...【详细内容】
2023-11-14  沐雨花飞蝶  微信公众号  Tags:Android   点击:(279)  评论:(0)  加入收藏
你了解Android中的SELinux吗?
SELinux介绍SELinux(Security-Enhanced Linux)是一种安全增强的Linux操作系统,它通过强制访问控制(MAC)机制来提供更高级别的系统安全保护。相比于传统的Linux访问控制机制(DAC),SEL...【详细内容】
2023-11-09  沐雨花飞蝶  微信公众号  Tags:Android   点击:(272)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条