【Compose Multiplatform】CMPでROOMデータベースを使用する - [KSP2] ネストされた注釈で注釈値が欠けている
はじめに
重要な注意事項 - CMPでのROOM使用における現在の互換性問題
-
注意1. Roomバージョン2.7.0-alpha01以降がKMMをサポートしています。
-
注意2. kspをインポートする際、Kotlinのバージョンの違いにより互換性の問題が発生し、
ビルドに失敗する
ことがあります。
この場合、サポートされているバージョンについて公式GitHubをチェックできます:ksp releases
- 注意3. Kotlinとkspを使用すると、kspバージョンとKotlinの互換性がチェックされます。
Kotlin 2.0.0を使用する場合、gradle sync
の際にバージョンの互換性に関するエラーが表示されることがあります。
例えば Cannot change attributes of configuration ':composeApp:debugFrameworkIosX64' after it has been locked for mutation
または [KSP2] Annotation value is missing in nested annotations
最初はKSP2
の問題について
gradle.propertiesにksp.useKSP2=true
を追加することで解決策を見つけました。
しかし、この問題を解決して
gradle sync
を通過した後でも
kspでRoomを設定する際に問題が発生します。
例えば、ksp(libs.androidx.room.compiler)
をセットアップした後、
常にDAOが見つからないエラーが発生します:[ksp] [MissingType]: xxxxx 'data.xxx.xxxDao' references a type that is not present
この問題を調査した結果
Kotlinのバージョンをkspのバージョンに合わせて下げることを提案する人もいますが
現在CMPの公式Wizardではデフォルトでコトリン2.0.0が使用されているため
新しいバージョンを使うという原則に従い(笑)
Kotlin 2.0.0でRoomを正常にセットアップするには、回避策を使用する必要があります
公式の解決策が出るまで、以下の方法を参照できます
以下に方法を提供します
参考にしてください
また、他の開発者がすでに公式チームに問題を報告しているのも確認しました:
実装
- ステップ1. Roomをインポート
-
.tomlファイルに以下を追加:
-
build.gradle.ktsにプラグインを追加:
-
build.gradle.ktsにライブラリを追加:
-
build.gradle.ktsの外層に以下のコードを追加:
-
Kotlinのバージョンが1.9.20より大きい場合、gradle.propertiesに以下を追加:
-
-
ステップ1. kspバージョンを変更:
-
ステップ2. build.gradle.ktsを調整:
-
kotlinブロックに
build/generated/ksp/metadata
を追加 -
addメソッドを使用してkspをインポート
-
外層にtasks.withTypeを追加
-
-
ステップ3. 回避策を使用してRoomDatabaseを実装
これは現在の回避策です
Kotlin 2.0.0を使用している場合は、これを行う必要があります
公式チームが互換性の問題を解決するのを待つ必要があるためです
実際のRoomの使用
Koin:
Koin:
Dao
Entity