マルチプラットフォームでのSQLite入門
まずプロジェクトにGradleプラグインを適用してください。
plugins {
id("app.cash.sqldelight") version "2.1.0"
}
repositories {
google()
mavenCentral()
}
sqldelight {
databases {
create("Database") {
packageName.set("com.example")
}
}
}
plugins {
id "app.cash.sqldelight" version "2.1.0"
}
repositories {
google()
mavenCentral()
}
sqldelight {
databases {
Database { // This will be the name of the generated database class.
packageName = "com.example"
}
}
}
SQLステートメントは、src/main/sqldelight
配下の.sq
ファイルに記述します。 通常、.sq
ファイルの最初のステートメントはテーブルを作成しますが、インデックスを作成したり、デフォルトコンテンツを設定することもできます。
CREATE TABLE hockeyPlayer (
player_number INTEGER PRIMARY KEY NOT NULL,
full_name TEXT NOT NULL
);
CREATE INDEX hockeyPlayer_full_name ON hockeyPlayer(full_name);
INSERT INTO hockeyPlayer (player_number, full_name)
VALUES (15, 'Ryan Getzlaf');
これらのステートメントに基づいて、SQLDelight は、データベースの作成やステートメントの実行に使用できる、関連する Schema
オブジェクトを持つ Database
クラスを生成します。Database
クラスは generateSqlDelightInterface
Gradle タスクによって生成されます。このタスクは、.sq
ファイルを編集する際に SQLDelight IDE プラグインによって自動的に実行されるほか、通常の Gradle ビルドの一部としても実行されます。
生成されたデータベースをコードで使用するには、プロジェクトにSQLDelightドライバーの依存関係を追加する必要があります。 各ターゲットプラットフォームには、独自のドライバー実装があります。
kotlin {
sourceSets.androidMain.dependencies {
implementation("app.cash.sqldelight:android-driver:2.1.0")
}
// or iosMain, windowsMain, etc.
sourceSets.nativeMain.dependencies {
implementation("app.cash.sqldelight:native-driver:2.1.0")
}
sourceSets.jvmMain.dependencies {
implementation("app.cash.sqldelight:sqlite-driver:2.1.0")
}
}
kotlin {
sourceSets.androidMain.dependencies {
implementation "app.cash.sqldelight:android-driver:2.1.0"
}
// or iosMain, windowsMain, etc.
sourceSets.nativeMain.dependencies {
implementation "app.cash.sqldelight:native-driver:2.1.0"
}
sourceSets.jvmMain.dependencies {
implementation "app.cash.sqldelight:sqlite-driver:2.1.0"
}
}
ドライバーインスタンスの構築
SqlDriver
インスタンスを取得するための共通のファクトリークラスまたはメソッドを作成します。
import com.example.Database
expect class DriverFactory {
fun createDriver(): SqlDriver
}
fun createDatabase(driverFactory: DriverFactory): Database {
val driver = driverFactory.createDriver()
val database = Database(driver)
// Do more work with the database (see below).
}
次に、各ターゲットプラットフォーム向けにこれを実装します。
actual class DriverFactory(private val context: Context) {
actual fun createDriver(): SqlDriver {
return AndroidSqliteDriver(Database.Schema, context, "test.db")
}
}
actual class DriverFactory {
actual fun createDriver(): SqlDriver {
return NativeSqliteDriver(Database.Schema, "test.db")
}
}
actual class DriverFactory {
actual fun createDriver(): SqlDriver {
val driver: SqlDriver = JdbcSqliteDriver("jdbc:sqlite:test.db", Properties(), Database.Schema)
return driver
}
}
Kotlin/JSで使用する場合、こちらを参照してください。
型安全なクエリの定義
SQLDelightは、.sq
ファイル内のラベル付きSQLステートメントに対して型安全な関数を生成します。
selectAll:
SELECT *
FROM hockeyPlayer;
insert:
INSERT INTO hockeyPlayer(player_number, full_name)
VALUES (?, ?);
insertFullPlayerObject:
INSERT INTO hockeyPlayer(player_number, full_name)
VALUES ?;
ラベル付きステートメントを含む各.sq
ファイルには、「Queries」オブジェクトが生成されます。 たとえば、上記のPlayer.sq
ファイルに対してはPlayerQueries
オブジェクトが生成されます。 このオブジェクトを使用して、実際のSQLステートメントを実行する生成された型安全な関数を呼び出すことができます。
fun doDatabaseThings(driver: SqlDriver) {
val database = Database(driver)
val playerQueries: PlayerQueries = database.playerQueries
println(playerQueries.selectAll().AsList())
// [HockeyPlayer(15, "Ryan Getzlaf")]
playerQueries.insert(player_number = 10, full_name = "Corey Perry")
println(playerQueries.selectAll().AsList())
// [HockeyPlayer(15, "Ryan Getzlaf"), HockeyPlayer(10, "Corey Perry")]
val player = HockeyPlayer(10, "Ronald McDonald")
playerQueries.insertFullPlayerObject(player)
}
以上です!他の機能については、サイドバーの他のページを確認してください。