Kotlin Multiplatform Mobile(KMM)ライブラリでSQLDelightを使う設定
Kotlin Multiplatform Mobile(KMM)は、AndoridとiOS両方のアプリにおいて、主にUI以外の内部処理(ビジネスロジック、とよく言われます)を共通化することができる開発環境です。
Android StudioでのKMMアプリのプロジェクトでは、デフォルトのレンプレートだとAndroidに向けてはAndroid Studioのプロジェクトが、iOSに向けてはXcodeのプロジェクトが、またその両プロジェクトで共有するライブラリとしてKMMライブラリプロジェクトが、それぞれ自動的に作成されます。
しかし、私個人としてはこのデフォルトテンプレートでのKMMアプリプロジェクトだと特にXcodeとの接続周りでかなり使い勝手が悪いと感じています。
そのため、最近はマルチプラットフォームアプリを開発する場合、Android StudioにてAndroidプロジェクトとKMMライブラリモジュールを、XcodeにてiOSプロジェクトをそれぞれ別個に作成し、AndroidプロジェクトからはKMMライブラリをモジュールとして参照しつつ、XcodeからはKMMライブラリからビルドされたフレームワーク(XCFramework)を参照する、という方法にしています。
この理由や具体的な方法などについてはまた別途解説することとして、このエントリーでは、上記のようにAndroid StudioにてAndoridアプリプロジェクト+KMMライブラリの形で開発する際のSQLDelightの設定方法について解説します。
SQLDelightとは
SQLDelightとは、KotlinにてSQLiteを使うためのライブラリで、AndroidだけでなくiOSやJavaなどマルチプラットフォームに対応しています。
初期設定がやや面倒な部分もありますが、特にKMMではAndroid・iOS両アプリにてデータベース関連の定義や処理を共有できるため大変便利です。
このSQLDelight、公式の実装例にマルチプラットフォームでの例が記載されてはいるものの、「KMMライブラリに対してのみSQLDelightを設定し」、Android・iOSアプリからは参照して使うだけにする、となると設定箇所や記載方法が少し異なってきます。
そのため、以下に、2022/06/19時点での公式での記載を基に、私が実際に開発する際の設定を例に挙げながら解説します。
まずはプロジェクトの設定
今回の解説では、上記前説でも記載している通り、以下のようなプロジェクト構成とします。
[Andorid Studio]
- Androidアプリ用プロジェクト(KMMアプリプロジェクトではなく普通のAndroidプロジェクト)
- KMMライブラリ(今回のメイン、Androidアプリ用プロジェクトのモジュールとして別途作成。iOSフレームワークにはXCFrameworkを設定)
[Xcode]
- iOSアプリ用プロジェクト(別途KMMライブラリにて生成したXCFrameworkを参照)
SQLDelightを使うための準備として、最初にGradleファイルへの設定を行います。
以下、公式に記載の設定内容をそのまま引用します。
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.squareup.sqldelight:gradle-plugin:1.5.3'
}
}
apply plugin: 'com.squareup.sqldelight'
sqldelight {
Database { // This will be the name of the generated database class.
packageName = "com.example"
}
}
上記の記載そのままだと、
- プロジェクト内のどのgradleファイルに記載すれば良いのか不明
- プロジェクト全体のbuild.gradleファイルに全て記載してもビルドエラーになる
- KMMライブラリ用のgradleファイルに記載してもエラー
- Androidアプリ用のgradleファイルに記載してもエラー
といった部分が出てきます。(Gradleに慣れ親しんでいる方なら上記の記載だけでどこに設定すれば良いのかピンとくるのかもしれませんが・・・)
正しく設定するためには、上記の公式の記載内容を、一部変更しつつ別のbuild.gradleファイルに分けて記載する必要があります。
1)プロジェクト全体のbuild.gradle
まず、上記公式記載の7行目、プロジェクトとしてSQLDelightを参照しますよ、とある(と個人的に解釈している)部分、
classpath 'com.squareup.sqldelight:gradle-plugin:1.5.3'
を、プロジェクト全体のbuild.gradleファイルに、形を変えて以下のように記載します。
plugins {
id 'com.android.application' version '7.2.1' apply false
id 'com.android.library' version '7.2.1' apply false
id 'org.jetbrains.kotlin.android' version '1.7.0' apply false
// <--- ここまではAndoridプロジェクト作成時に自動生成されている部分
id 'com.squareup.sqldelight' version '1.5.3' apply false // 追加
}
この記載で、「プロジェクトとしてcom.squareup.sqldelightのバージョン1.5.3を参照しますが、自動的に適用せず、各サブプロジェクトで個別に適用できるようにします」(個人的解釈)と設定できました。
2)KMMライブラリのbuild.gradle
次に、KMMライブラリのbuild.gradleの設定です。
ここでは、上記公式記載の10行目以降、
apply plugin: 'com.squareup.sqldelight'
sqldelight {
Database { // This will be the name of the generated database class.
packageName = "com.example"
}
}
にあたる部分を設定します。
以下のように設定していきます。
// "plugin"の箇所
plugins {
kotlin("multiplatform")
id("com.android.library")
// apply plugin: 'com.squareup.sqldelight' を以下のように変更して記載
id("com.squareup.sqldelight")
}
... その他Gradleの記述 ...
// ファイルの最後に以下を追記
sqldelight {
// ↓コード上で実際のSQLiteデータベースを表すクラス名の指定
database("KmmProjectDb") {
// ↓SQLDelight関連ファイルを格納するフォルダ名の指定。
// 下記だと<KMM lib>/src/commonMain/sqldelight がソースフォルダになる
sourceFolders = listOf("sqldelight")
// ↓SQLDelightで自動生成される各クラスのルートパッケージ名の指定。
// 上記で指定したソースフォルダ内にて、パッケージ名に沿った階層のフォルダが必要。
// 以下の例だと <KMM lib>/src/commonMain/sqldelight/com/example/sqldelight が各種SQLDelightファイル格納場所のルートになる
packageName = "com.example.sqldelight"
}
}
各種build.gradleファイルへの設定は以上です。
ここまで行った上で、公式ドキュメントにある.sqファイルの作成以降の手順を実行していくと、上記の例だと”KmmProjectDb”というクラスを通してSQLiteデータベースの操作が可能です。
実際の使用例については、また別のエントリーにて解説していきたいと思います。