Skip to content

2.0へのアップグレード

SQLDelight 2.0では、GradleプラグインとランタイムAPIにいくつかの破壊的変更が加えられています。

このページでは、それらの破壊的変更点と2.0での新しい同等物について説明します。新機能やその他の変更点の完全なリストについては、変更履歴を参照してください。

新しいパッケージ名とアーティファクトグループ

com.squareup.sqldelightのすべてのインスタンスをapp.cash.sqldelightに置き換える必要があります。

Gradleの依存関係
diff
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")
}
コード内
diff
-import com.squareup.sqldelight.db.SqlDriver
+import app.cash.sqldelight.db.SqlDriver

Gradle設定の変更点

  • SQLDelight 2.0のビルドにはJava 11が、ランタイムにはJava 8が必要です。

  • SQLDelightの設定APIでは、データベースにマネージドプロパティとDomainObjectCollectionを使用するようになりました。

    kotlin
    sqldelight {
      databases { // (1)!
        create("Database") {
          packageName.set("com.example") // (2)!
        }
      }
    }
      1. 新しい`DomainObjectCollection`ラッパーです。
      2. `Property<String>`になりました。
    
    kotlin
    sqldelight {
      databases { // (1)!
        Database {
          packageName = "com.example"
        }
      }
    }
      1. 新しい`DomainObjectCollection`ラッパーです。
    
  • sourceFolders設定がsrcDirsに名称変更されました。

    groovy
    sqldelight {
      databases {
        create("MyDatabase") {
          packageName.set("com.example")
          srcDirs.setFrom("src/main/sqldelight")
        }
      }
    }
    groovy
    sqldelight {
      databases {
        MyDatabase {
          packageName = "com.example"
          srcDirs = ['src/main/sqldelight']
        }
      }
    }
  • データベースのSQL方言(ダイアレクト)は、Gradleの依存関係を使用して指定されるようになりました。

    groovy
    sqldelight {
      databases {
        create("MyDatabase") {
          packageName.set("com.example")
          dialect("app.cash.sqldelight:mysql-dialect:2.1.0")
    
          // Version catalogs also work!
          dialect(libs.sqldelight.dialects.mysql)
        }
      }
    }
    groovy
    sqldelight {
      databases {
        MyDatabase {
          packageName = "com.example"
          dialect "app.cash.sqldelight:mysql-dialect:2.1.0"
    
          // Version catalogs also work!
          dialect libs.sqldelight.dialects.mysql
        }
      }
    }

    現在サポートされている方言は、mysql-dialectpostgresql-dialecthsql-dialectsqlite-3-18-dialectsqlite-3-24-dialectsqlite-3-25-dialectsqlite-3-30-dialectsqlite-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拡張関数は、コールバックを受け入れるようになったメインのmigrateメソッドに置き換えられました。

    diff
    Database.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: SqlSchema
  • Paging3拡張APIは、カウントにInt型のみを許可するように変更されました。

  • コルーチン拡張APIでは、ディスパッチャを明示的に渡す必要があります。

    diff
    val 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範囲を必要とするドライバーは、範囲外のバージョンの場合、データベース作成前にクラッシュします。