iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0

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,才能真正的跑起來,明天我們會繼續這段.


上一篇
Day 21: iOS也懂Koin喔?其實是KMM當工具人啦
下一篇
Day 23: 不同的環境,不同的Driver,利用Driver 駕馭SQLDelight
系列文
挑戰 Kotlin Multiplatform Mobile 跨平台開發,透過共同的Kotlin模組同時打造iOS與Android應用!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言