Day 22:开心SQL,SQLDelight

Keyword: SQLDelight,SQL语法
到23日,引入SQLDelight,到在Android上呈现DB资料
KMMDay23


在App的使用场景中,资料库占了非常重要的一个地位.我们的双平台App由於没有资料库,因此在进入APp到Api回传结果的这几秒,画面是一片空白的.使用者体验很不好.另外,我们还需要花费宝贵的流量,来进行网路请求.而且这些资料都是一样的,只是我们没有储存起来,以致於每次回到页面都需要重新进行一次网路请求,白白浪费掉了效能与资源.如果有个资料库,就能够预先把这些网路请求的结果储存起来.

而在Android里面,我们有SQLiteHelper、Room等等的常用资料库工具或架构,而在Apple的系统上有官方推出(非常难用的)CoreData与较为流行的FMDB等等的.但是很可惜,虽然大部分都是SQLLite封装,但是却只能在各自的平台使用.Room的DB ,FMDB不了解.而FMDB的档案 Room也不能使用.所以我们将会使用SQLDelight这个框架来完成资料库的工作.

SQLDelight

https://github.com/officeyuli/itHome2021/raw/main/Day22/1_p9xEcXU5CXOpFkbICwQrbw.png

SQLDelight是(在Android界)由大名鼎鼎的Square所开发的,这家公司有名的作品,例如Retrofit, LeakCanary 都可以算是Android开发的标准配置了.而这个SQLDelight是使用纯Kotlin开发,借助跨平台的特性,提供不同的实作.

SQLDelight用起来有点类似Android的Room,会先扫描整个专案的程序码,找出需要使用到的SQL并且建立档案,以供实际使用.所以会影响一点点编译的时间.

(KMM跟Koin也会增加编译时间,可以摸鱼的时间真的越来越长了)

建立环境

首先,要先安装SQLDelight的Plugin,这个Plugin会帮助扫描整个专案,同时也会让开发变顺利.跟之前安装KMM Plugin一样,在Android Studio 的Plugin market找到SQLDelight的Plugin并安装,装完记得重新启动Android Studio

https://github.com/officeyuli/itHome2021/raw/main/Day22/SQLDelightPlugin.jpg

然後我们要加入依赖,同样的在buildSrc下的Dependencies中加入SQLDelight的版本,以供其他gradle设定使用

object Versions{
    ...
    val sqlDelight = "1.5.0"

    ...
}

object Develop{
    ...

    object SqlDelight {
        val gradle = "com.squareup.sqldelight:gradle-plugin:${Versions.sqlDelight}"
        val runtime = "com.squareup.sqldelight:runtime:${Versions.sqlDelight}"
        val coroutinesExtensions = "com.squareup.sqldelight:coroutines-extensions:${Versions.sqlDelight}"
        val runtimeJdk = "com.squareup.sqldelight:runtime-jvm:${Versions.sqlDelight}"
        val driverIos = "com.squareup.sqldelight:native-driver:${Versions.sqlDelight}"
        val driverAndroid = "com.squareup.sqldelight:android-driver:${Versions.sqlDelight}"
    }
    ...
}

由於SQLDelight作用的范围也比较大,所以有很多Gradle档案需要添加或修改.

首先是最外层的gradle(Project),在dependencies中加入

dependencies {
        ...
		classpath(Deps.SqlDelight.gradle)
        ...
    }

然後是shared内的的gradle(shared),由於SQLDeilght会根据平台不同选择不同的实作方法,所以不只commonMain,androidMain跟iOSMain都要加入引用

plugins {
	...
	id("com.squareup.sqldelight")
    ...
}

...

sourceSets["commonMain"].dependencies {
       ...
	   implementation(Deps.SqlDelight.runtime)
       implementation(Deps.SqlDelight.coroutinesExtensions)
       ...
}

sourceSets["androidMain"].dependencies {
        ...
		implementation(Deps.SqlDelight.driverAndroid)       
		...
}
sourceSets["iosMain"].dependencies {
		...
		implementation(Deps.SqlDelight.driverIos)       
		...
}

最後是gradle(Android)也需要添加一些

dependencies {
		...
		implementation(Deps.SqlDelight.runtimeJdk)
	    implementation(Deps.SqlDelight.driverAndroid)
		...
}

然後在gradle(shared)的最外层,加上SQLDelight的设定,这会变成db的名称

sqldelight {
    database("CafeDB") {//这边填入DB名称
        packageName = "com.officeyuli.kmmitexample"//与等等设定DB的package路径相同
    }
}

建立DB与Table

然後我们在shared的commonMain,与"kotlin同级的地方“建立一另外一个路径sqldelight,如下:

https://github.com/officeyuli/itHome2021/raw/main/Day22/sharedPath.jpg

然後照着刚刚在gradle(shared)所设定的package一路建立下来

https://github.com/officeyuli/itHome2021/raw/main/Day22/sharedPath2.jpg

最後在这个路径下建立一个新档案,档名是没有差别,但是副档名要是sq才能被SQLDelight扫到并且生成实作.如果Android Studio已经装了SQLDelight的 plugin,会变成有个羽毛笔的样式.

https://github.com/officeyuli/itHome2021/raw/main/Day22/sharedPath3.jpg

然後就能在里面写SQL了,注意这边是需要分号的,并不是Kotlin喔

--这边是SQL所以注解也变成--了
CREATE TABLE CAFE (--建立起Cafe的表格
    id TEXT NOT NULL PRIMARY KEY,
    name TEXT,
    address TEXT
);

insertCafe:--存值
INSERT INTO CAFE(id, name, address) VALUES (?,?,?);

getAll:--捞取资料
SELECT * FROM CAFE;

然後重新编译一次,如果顺利的话SQLDelight就会自动产生物件了.可以用全域搜寻刚刚设定的DB名称,例如我上面就是用"CafeDB",来看看SQLDelight的产物

https://github.com/officeyuli/itHome2021/raw/main/Day22/db.jpg

虽然这边成功建立了一个DB与Table,但是双平台还有不同的实作方法,需要SQLite Driver,才能真正的跑起来,明天我们会继续这段.


<<:  文句中的打太极,原来就是local maximum

>>:  【Day12】漏洞分析Vulnerability Analysis(一)

Thunkable学习笔记 3 - 读取Realtime Database的值(Firebase)

於Realtime Database内手动建立如下图的资料, 试着使用thunkable读取, 测试...

[day-16] 认识Python的资料结构!(Part .3)

用List实现多层容器   何谓 多层容器 ?我们前面说过List可以存放 『任意型别』 ,其中也包...

DAY2 起手式--Nuxt.js目录结构

目录结构落落长是怎样!? 没关系,一起简单了解 上篇我们建立了 Nuxt.js 环境,应该可以看到资...

[Day 14] 人脸识别 (Facial Recognition)

想像一天早上你站在办公室的玻璃门前,看向门口上方的摄影镜头;约莫数秒後,听见悦耳的人声: 「早安,...

【Android-Notification(通知)】 介绍+实作练习

前言: 通常会和Broadcast(广播)一起使用,在app status条显示的资料, 可以在Ap...