Kotlin/Native での SQLDelight 入門
Kotlin/Native メモリマネージャー
SQLDelight 2.0 以降、SQLDelight Native ドライバーは Kotlin/Native の 新しいメモリマネージャー のみをサポートしています。
まずプロジェクトに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 Native ドライバーの依存関係をプロジェクトに追加する必要があります。
kotlin {
// または iosMain、windowsMain など
sourceSets.nativeMain.dependencies {
implementation("app.cash.sqldelight:native-driver:2.1.0")
}
}
kotlin {
// または iosMain、windowsMain など
sourceSets.nativeMain.dependencies {
implementation "app.cash.sqldelight:native-driver:2.1.0"
}
}
ドライバーのインスタンスは以下に示すように構築でき、生成された Schema
オブジェクトへの参照が必要です。
val driver: SqlDriver = NativeSqliteDriver(Database.Schema, "test.db")
型安全なクエリの定義
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)
}
以上です!他の機能については、サイドバーの他のページを確認してください。
リーダー接続プール
ディスクデータベースは、(オプションで)複数のリーダー接続を持つことができます。リーダープールを設定するには、maxReaderConnections
パラメーターを NativeSqliteDriver
のさまざまなコンストラクターに渡します。
val driver: SqlDriver = NativeSqliteDriver(
Database.Schema,
"test.db",
maxReaderConnections = 4
)
リーダー接続は、トランザクション外でクエリを実行するためにのみ使用されます。あらゆる書き込み呼び出し、およびトランザクション内のすべてのものは、トランザクション専用の単一の接続を使用します。