升級至 2.0
SQLDelight 2.0 對 Gradle 外掛程式和執行時 API 進行了一些破壞性變更。
本頁面列出了這些破壞性變更及其在 2.0 中的新對應項。 若要查看新功能和其他變更的完整列表,請參閱 changelog。
新的套件名稱與構件群組
所有 com.squareup.sqldelight 的執行個體都需要替換為 app.cash.sqldelight。
plugins {
- id("com.squareup.sqldelight") version "2.1.0"
+ id("app.cash.sqldelight") version "2.1.0"
}
dependencies {
- implementation("com.squareup.sqldelight:sqlite-driver:2.1.0")
+ implementation("app.cash.sqldelight:sqlite-driver:2.1.0")
}
對於純 Android 的 SQLDelight 1.x 專案,請使用 android-driver 和 coroutines-extensions-jvm:
dependencies {
- implementation("com.squareup.sqldelight:android-driver:2.1.0")
+ implementation("app.cash.sqldelight:android-driver:2.1.0")
- implementation("com.squareup.sqldelight:coroutines-extensions:2.1.0")
+ implementation("app.cash.sqldelight:coroutines-extensions-jvm:2.1.0")
}-import com.squareup.sqldelight.db.SqlDriver
+import app.cash.sqldelight.db.SqlDriverGradle 配置變更
SQLDelight 2.0 在組建時需要 Java 11,執行時則需要 Java 8。
SQLDelight 配置 API 現在針對資料庫使用受控屬性和
DomainObjectCollection。kotlinsqldelight { databases { // (1)! create("Database") { packageName.set("com.example") // (2)! } } }1. 新的 `DomainObjectCollection` 包裝函式。 2. 現在是一個 `Property<String>`。kotlinsqldelight { databases { // (1)! Database { packageName = "com.example" } } }1. 新的 `DomainObjectCollection` 包裝函式。sourceFolders設定已重新命名為srcDirsgroovysqldelight { databases { create("MyDatabase") { packageName.set("com.example") srcDirs.setFrom("src/main/sqldelight") } } }groovysqldelight { databases { MyDatabase { packageName = "com.example" srcDirs = ['src/main/sqldelight'] } } }您資料庫的 SQL 方言現在使用 Gradle 相依性來指定。
groovysqldelight { databases { create("MyDatabase") { packageName.set("com.example") dialect("app.cash.sqldelight:mysql-dialect:2.1.0") // 版本目錄 (Version catalogs) 也同樣適用! dialect(libs.sqldelight.dialects.mysql) } } }groovysqldelight { databases { MyDatabase { packageName = "com.example" dialect "app.cash.sqldelight:mysql-dialect:2.1.0" // 版本目錄 (Version catalogs) 也同樣適用! dialect libs.sqldelight.dialects.mysql } } }目前支援的方言包括
mysql-dialect、postgresql-dialect、hsql-dialect、sqlite-3-18-dialect、sqlite-3-24-dialect、sqlite-3-25-dialect、sqlite-3-30-dialect、sqlite-3-35-dialect以及sqlite-3-38-dialect
執行時變更
原始型別現在必須匯入至
.sq和.sqm檔案中。diff+import kotlin.Boolean; CREATE TABLE HockeyPlayer ( name TEXT NOT NULL, good INTEGER AS Boolean );一些先前支援的型別現在需要轉接器。原始型別的轉接器可在
app.cash.sqldelight:primitive-adapters:2.1.0構件中取得。 例如:用於執行INTEGER As kotlin.Int轉換的IntColumnAdapter。AfterVersionWithDriver型別已被移除,取而代之的是AfterVersion,它現在一律包含驅動程式;而migrateWithCallbacks擴充函式也被移除,取而代之的是現在可接收回呼 (callbacks) 的主migrate方法。diffDatabase.Schema.migrateWithCallbacks( driver = driver, oldVersion = 1, newVersion = Database.Schema.version, - AfterVersionWithDriver(3) { driver -> - driver.execute(null, "INSERT INTO test (value) VALUES('hello')", 0) - } + AfterVersion(3) { driver -> + driver.execute(null, "INSERT INTO test (value) VALUES('hello')", 0) + } )Schema型別不再是SqlDriver的巢狀型別,現在稱為SqlSchema。diff-val schema: SqlDriver.Schema +val schema: SqlSchemapaging3 擴充套件 API 已變更為僅允許 int 型別作為計數。
coroutines 擴充套件 API 現在要求必須明確傳入一個分派器 (dispatcher)。
diffval players: Flow<List<HockeyPlayer>> = playerQueries.selectAll() .asFlow() + .mapToList(Dispatchers.IO)一些驅動程式方法,如
execute()、executeQuery()、newTransaction()和endTransaction(),現在會傳回QueryResult物件。請使用QueryResult.value來存取傳回的值。diff-driver.executeQuery(null, "PRAGMA user_version", { /*...*/ }) +driver.executeQuery(null, "PRAGMA user_version", { /*...*/ }).value這項變更讓驅動程式實作能夠基於非阻塞 API,並透過暫停方法
QueryResult.await()來存取傳回的值。SqlCursor介面上的next()方法也已變更為傳回QueryResult,以便為非同步驅動程式提供更好的游標支援。
SqlSchema介面現在具有泛型QueryResult型別參數。這用於區分專為非同步驅動程式產生的架構執行時,這些執行時可能無法直接與同步驅動程式相容。 這僅與同時使用同步和非同步驅動程式的專案有關,例如具有 JS 目標的多平台專案。詳情請參閱「搭配 Web Worker 驅動程式的多平台設置」。SqlSchema.Version的型別從 Int 變更為 Long,以便讓伺服器環境能夠利用時間戳記作為版本。現有的配置可以安全地在 Int 與 Long 之間進行轉換,而對於版本需要 Int 範圍的驅動程式,若版本超出範圍,將會在資料庫建立前崩潰。
