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是(在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
然後我们要加入依赖,同样的在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路径相同
}
}
然後我们在shared的commonMain,与"kotlin同级的地方“建立一另外一个路径sqldelight,如下:
然後照着刚刚在gradle(shared)所设定的package一路建立下来
最後在这个路径下建立一个新档案,档名是没有差别,但是副档名要是sq才能被SQLDelight扫到并且生成实作.如果Android Studio已经装了SQLDelight的 plugin,会变成有个羽毛笔的样式.
然後就能在里面写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的产物
虽然这边成功建立了一个DB与Table,但是双平台还有不同的实作方法,需要SQLite Driver,才能真正的跑起来,明天我们会继续这段.
>>: 【Day12】漏洞分析Vulnerability Analysis(一)
於Realtime Database内手动建立如下图的资料, 试着使用thunkable读取, 测试...
用List实现多层容器 何谓 多层容器 ?我们前面说过List可以存放 『任意型别』 ,其中也包...
目录结构落落长是怎样!? 没关系,一起简单了解 上篇我们建立了 Nuxt.js 环境,应该可以看到资...
想像一天早上你站在办公室的玻璃门前,看向门口上方的摄影镜头;约莫数秒後,听见悦耳的人声: 「早安,...
前言: 通常会和Broadcast(广播)一起使用,在app status条显示的资料, 可以在Ap...