androidx.sqlite ライブラリには抽象的なインターフェースとともに基本的な実装が含まれており、これを使用して SQLite にアクセスする独自のライブラリを構築できます。Room ライブラリの使用を検討することをおすすめします。このライブラリは SQLite に抽象化レイヤを提供することで、より強固なデータベース アクセスを実現し、SQLite の全機能を活用できるようにします。
依存関係を設定する
KMP プロジェクトで SQLite をセットアップするには、モジュールの build.gradle.kts ファイルにアーティファクトの依存関係を追加します。
[versions]
sqlite = "2.7.1"
[libraries]
# The SQLite Driver interfaces
androidx-sqlite = { module = "androidx.sqlite:sqlite", version.ref = "sqlite" }
# The bundled SQLite driver implementation
androidx-sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" }
[plugins]
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
SQLite ドライバ API
androidx.sqlite ライブラリ グループは、androidx.sqlite:sqlite-bundled の使用時にライブラリに含まれる SQLite ライブラリ、または androidx.sqlite:sqlite-framework の使用時に Android や iOS などのホスト プラットフォームに含まれる SQLite ライブラリと通信するための低レベル API を提供します。これらの API は、SQLite C API のコア機能に厳密に準拠しています。
主なインターフェースは次の 3 つです。
SQLiteDriver: SQLite へのエントリ ポイント。データベース接続を開くために使用されます。SQLiteConnection:sqlite3オブジェクトを表します。SQLiteStatement:sqlite3_stmtオブジェクトを表します。
次の例は、コア API を示しています。
fun main() { val databaseConnection = BundledSQLiteDriver().open("todos.db") databaseConnection.execSQL( "CREATE TABLE IF NOT EXISTS Todo (id INTEGER PRIMARY KEY, content TEXT)" ) databaseConnection.prepare( "INSERT OR IGNORE INTO Todo (id, content) VALUES (? ,?)" ).use { stmt -> stmt.bindInt(index = 1, value = 1) stmt.bindText(index = 2, value = "Try Room in the KMP project.") stmt.step() } databaseConnection.prepare("SELECT content FROM Todo").use { stmt -> while (stmt.step()) { println("Action item: ${stmt.getText(0)}") } } databaseConnection.close() }
SQLite C API と同様に、一般的な使用パターンは次の手順で構成されます。
- インスタンス化された
SQLiteDriver実装を使用してデータベース接続を開きます。 SQLiteConnection.prepareを使用して SQL ステートメントを準備します。- 次の操作を行って
SQLiteStatementを実行します。- 省略可:
bind*関数を使用して引数をバインドします。 step関数を使用して、結果セットを反復処理します。get*関数を使用して、結果セットから列を読み取ります。
- 省略可:
ドライバの実装
次の表に、使用可能なドライバの実装をまとめます。
クラス名 |
アーティファクト |
サポートされるプラットフォーム |
AndroidSQLiteDriver |
androidx.sqlite:sqlite-framework |
Android |
NativeSQLiteDriver |
androidx.sqlite:sqlite-framework |
iOS、Mac、Linux |
BundledSQLiteDriver |
androidx.sqlite:sqlite-bundled |
Android、iOS、Mac、Linux、JVM(デスクトップ) |
WebWorkerSQLiteDriver |
androidx.sqlite:sqlite-web |
JavaScript と WebAssembly(WasmJS) |
推奨される実装は、androidx.sqlite:sqlite-bundled で利用可能な BundledSQLiteDriver です。ソースからコンパイルされた SQLite ライブラリが含まれており、サポートされているすべての KMP プラットフォームで最新バージョンと一貫性が提供されます。
SQLite ドライバと Room
ドライバ API は、SQLite データベースとの低レベルのやり取りに役立ちます。SQLite へのより堅牢なアクセスを提供する、機能豊富なライブラリとして、Room をおすすめします。
RoomDatabase は SQLiteDriver を利用してデータベース オペレーションを実行します。RoomDatabase.Builder.setDriver を使用して実装を構成する必要があります。Room には、管理対象のデータベース接続に直接アクセスするための RoomDatabase.useReaderConnection と RoomDatabase.useWriterConnection が用意されています。
Kotlin Multiplatform に移行する
SupportSQLiteDatabase インターフェースなどの低レベルのサポート SQLite API コンポーネントを使用している場合は、同等の SQLite ドライバ コンポーネントに移行する必要があります。
Kotlin Multiplatform
低レベルの SQLiteConnection を使用してトランザクションを実行する
val connection: SQLiteConnection = BundledSQLiteDriver().open("todos.db") connection.execSQL("BEGIN IMMEDIATE TRANSACTION") try { // perform database operations in transaction. connection.execSQL("END TRANSACTION") } catch (t: Throwable) { connection.execSQL("ROLLBACK TRANSACTION") }
結果のないクエリを実行する
val connection: SQLiteConnection = BundledSQLiteDriver().open("todos.db") connection.execSQL("ALTER TABLE ...")
結果を返す引数なしのクエリを実行する
val connection: SQLiteConnection = BundledSQLiteDriver().open("todos.db") connection.prepare("SELECT * FROM Pet").use { statement -> while (statement.step()) { // read columns. statement.getInt(0) statement.getText(1) } }
結果と引数を指定してクエリを実行する
connection.prepare("SELECT * FROM Pet WHERE id = ?").use { statement -> statement.bindInt(1, id) if (statement.step()) { // row found, read columns. } else { // row not found. } }
Android のみ
SupportSQLiteDatabase を使用してトランザクションを実行する
val database: SupportSQLiteDatabase = ...
database.beginTransaction()
try {
// perform database operations in transaction
database.setTransactionSuccessful()
} finally {
database.endTransaction()
}
結果のないクエリを実行する
val database: SupportSQLiteDatabase = ...
database.execSQL("ALTER TABLE ...")
結果を返す引数なしのクエリを実行する
val database: SupportSQLiteDatabase = ...
database.query("SELECT * FROM Pet").use { cursor ->
while (cursor.moveToNext()) {
// read columns
cursor.getInt(0)
cursor.getString(1)
}
}
結果と引数を指定してクエリを実行する
database.query("SELECT * FROM Pet WHERE id = ?", id).use { cursor ->
if (cursor.moveToNext()) {
// row found, read columns
} else {
// row not found
}
}