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