Skip to content

SQLiteの型

SQLDelightの列定義は標準的なSQLiteの列定義と同一ですが、生成されるインターフェースにおける列のKotlin型を指定する追加の列制約をサポートしています。

sql
CREATE TABLE some_types (
  some_long INTEGER,           -- DBにはINTEGERとして保存され、Longとして取得されます
  some_double REAL,            -- DBにはREALとして保存され、Doubleとして取得されます
  some_string TEXT,            -- DBにはTEXTとして保存され、Stringとして取得されます
  some_blob BLOB               -- DBにはBLOBとして保存され、ByteArrayとして取得されます
);

プリミティブ型

便宜のためにプリミティブ型を適応させる補助モジュールです。

kotlin
dependencies {
  implementation("app.cash.sqldelight:primitive-adapters:2.1.0")
}
groovy
dependencies {
  implementation "app.cash.sqldelight:primitive-adapters:2.1.0"
}

以下のAdapterが存在します:

  • FloatColumnAdapterkotlin.Doubleとして暗黙的に保存されているSQL型に対してkotlin.Floatを取得します
  • IntColumnAdapterkotlin.Longとして暗黙的に保存されているSQL型に対してkotlin.Intを取得します
  • ShortColumnAdapterkotlin.Longとして暗黙的に保存されているSQL型に対してkotlin.Shortを取得します

カスタムカラム型

カスタム型としてカラムを取得したい場合は、Kotlin型を指定できます。

sql
import kotlin.String;
import kotlin.collections.List;

CREATE TABLE hockeyPlayer (
  cup_wins TEXT AS List<String> NOT NULL
);

しかし、Database を作成するには、データベース型とカスタム型の間でマッピングする方法を知っている ColumnAdapter を提供する必要があります。

kotlin
val listOfStringsAdapter = object : ColumnAdapter<List<String>, String> {
  override fun decode(databaseValue: String) =
    if (databaseValue.isEmpty()) {
      listOf()
    } else {
      databaseValue.split(",")
    }
  override fun encode(value: List<String>) = value.joinToString(separator = ",")
}

val queryWrapper: Database = Database(
  driver = driver,
  hockeyPlayerAdapter = hockeyPlayer.Adapter(
    cup_winsAdapter = listOfStringsAdapter
  )
)

列挙型

便宜上、SQLDelight ランタイムには、列挙型を String データとして保存するための ColumnAdapter が含まれています。

sql
import com.example.hockey.HockeyPlayer;

CREATE TABLE hockeyPlayer (
  position TEXT AS HockeyPlayer.Position
)
kotlin
val queryWrapper: Database = Database(
  driver = driver,
  hockeyPlayerAdapter = HockeyPlayer.Adapter(
    positionAdapter = EnumColumnAdapter()
  )
)

値型

要求された場合、SQLDelight は基となるデータベース型をラップするカラムの値型を生成できます。

sql
CREATE TABLE hockeyPlayer (
  id INT AS VALUE
);