簡(jiǎn)介
SQLDelight 是一個(gè)跨平臺(tái)的數(shù)據(jù)庫(kù),它與傳統(tǒng)的注釋處理和反射生成代碼的方式完全相反。
比起支持跨平臺(tái)這一特點(diǎn),SQLDelight 有一個(gè)更為重要的特點(diǎn):它能夠?qū)?SQL 代碼轉(zhuǎn)換為 Kotlin、Java 或者原生代碼,從而支持 Android、iOS、Web 等不同的平臺(tái)。
就算使用諸如 Room 數(shù)據(jù)庫(kù)之類的傳統(tǒng)的、平臺(tái)特定的庫(kù),也可以僅用 SQL 這一門語(yǔ)言輕松地創(chuàng)建數(shù)據(jù)庫(kù)表和操作。
SQLDelight 需要開(kāi)發(fā)者能自己編寫 SQL 查詢,這既是 SQLDelight 的優(yōu)勢(shì)也是它的劣勢(shì)。作為一名 Android 開(kāi)發(fā)人員,我不喜歡編寫除了 Kotlin/Java 以外的代碼,但另一方面,它給了我支持跨平臺(tái)的機(jī)會(huì)。
但是說(shuō)實(shí)話,開(kāi)發(fā)者開(kāi)發(fā)一個(gè)移動(dòng)端應(yīng)用程序時(shí),就算對(duì) SQL 的基礎(chǔ)編程方法和語(yǔ)法了解地不深入,也可以寫出 SQL 代碼并運(yùn)行編譯。
集成
把 SQLDelight 插件添加到項(xiàng)目級(jí) Gradle 文件中,如下面的代碼所示:
// 頂級(jí)構(gòu)建文件,可以在其中添加所有子項(xiàng)目/模塊的通用配置選項(xiàng)。buildscript { ext.kotlin_version = “1.4.32” repositories { google() jcenter() // SQLDelight 支持存儲(chǔ)庫(kù) 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}
第二步,需要在應(yīng)用級(jí) Gradle 文件上應(yīng)用 SQLDelight 插件來(lái)支持代碼生成。 SQLDelight 不會(huì)基于 kapt 這樣的注釋處理器來(lái)生成代碼。
生成特定平臺(tái)的代碼的過(guò)程之所以有效,是因?yàn)樽罱K執(zhí)行的都是 SQL 查詢,在某種程度上,這與 Room 數(shù)據(jù)庫(kù)等平臺(tái)特定庫(kù)是相似的??纯聪旅娴拇a:
plugins { id ‘com.android.application’ id ‘kotlin-android’ id ‘com.squareup.sqldelight’}
上面的操作已經(jīng)集成了通用的 SQLDelight 支持,現(xiàn)在需要添加 Android 支持庫(kù) —— AndroidSqliteDriver ,在依賴項(xiàng)節(jié)點(diǎn)應(yīng)用程序級(jí) Gradle 文件下添加以下代碼:
implementation “com.squareup.sqldelight:android-driver:1.3.0”
編寫 SQL 代碼
寫 SQL 代碼來(lái)創(chuàng)建數(shù)據(jù)庫(kù),首先應(yīng)該定位 *.sq 文件。在 main 目錄下創(chuàng)建一個(gè)名為 sqldelight 的單獨(dú)目錄(類似于 Java 和 Kotlin 代碼的文件夾),并將所有的 *.sq 文件存放其中。
src/main/sqldelight
緊接著,創(chuàng)建 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 moveItemORDER BY name;insertOrReplace:INSERT OR REPLACE INTO moveItem ( name, image, rating)VALUES (?, ?, ?);selectByName:SELECT *FROM moveItemWHERE name = ?;empty:DELETE FROM moveItem;
添加了上述代碼后,將會(huì)彈出提示安裝 SQLDelight Android Studio 插件。這不是強(qiáng)制性的,但它可以讓你更容易理解 SQL 語(yǔ)法。我建議安裝該插件。
Android 代碼
如上文所述,我們需要用 AndroidSqliteDriver 把數(shù)據(jù)寫進(jìn) Android 數(shù)據(jù)庫(kù),該數(shù)據(jù)庫(kù)在應(yīng)用程序啟動(dòng)期間持續(xù)存在。首先,創(chuàng)建 AndroidSqliteDriver 實(shí)例:
val androidSqlDriver = AndroidSqliteDriver( schema = Database.Schema, context = applicationContext, name = “movies.db”)
接著,需要獲取在 MovieItem.sql 文件中創(chuàng)建的查詢語(yǔ)句。代碼如下:
val queries = Database(androidSqlDriver).movieItemQueries
然后,直接執(zhí)行 MovieItem.sql 文件中的 selectAll 函數(shù),代碼如下:
val movies: List = queries.selectAll().executeAsList()Log.d(“MovieDatabase”, “Movies : $movies”)
協(xié)程支持
Room 庫(kù)成功背后的主要原因之一是它易于使用,而且與 coroutines 和 paging 等流行框架相兼容。
SQLDelight 也有這個(gè)好處;我們只需要在應(yīng)用程序級(jí)別的 Gradle 文件的 dependencies 節(jié)點(diǎn)下添加以下這行代碼就可以了:
implementation “com.squareup.sqldelight:coroutines-extensions-jvm:1.5.0”
現(xiàn)在就像在 Room 庫(kù)中使用協(xié)程一樣簡(jiǎn)單。代碼如下:
val players: Flow = queries.selectAll() .asFlow() .mapToList()
如果你仍在使用 RxJava,那么你可以添加下面這行代碼,以便將 RxJava 支持集成到 SQLDelight 中:
implementation “com.squareup.sqldelight:rxjava3-extensions:1.5.0”
現(xiàn)在來(lái)觀察這個(gè)查詢,我們可以使用 RxJava 擴(kuò)展構(gòu)件,如下所示:
val players: Flow = queries.selectAll() .asObservable() .mapToList()
這就是目前的全部?jī)?nèi)容,希望你能有所收獲。
作者:披著狼皮的羊_鏈接:https://juejin.cn/post/7111246458895990792