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