【Compose Multiplatform】CMPでROOMデータベースを使用する - [KSP2] ネストされた注釈で注釈値が欠けている
目錄
- 【Compose Multiplatform】專案轉移探討與開發指南
- 【Compose Multiplatform】手機使用依賴注入Koin
- 【Compose Multiplatform 】跨平台App但Android需要context作法並搭配Koin
- 【Compose Multiplatform】手機本地持久化儲存DataStore實作
- 【Compose Multiplatform】手機資料庫SqlDelight實作
- 【Compose Multiplatform】CMP中使用ROOM開發資料庫 - [KSP2] Annotation value is missing in nested annotations
- 【Compose Multiplatform】CMP專案中導入CocoaPods及無CocoaPods情況下使用IOS Swift/Obj-C
-
注意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を追加
- kotlinブロックに
- ステップ3. 回避策を使用してRoomDatabaseを実装
これは現在の回避策です
Kotlin 2.0.0を使用している場合は、これを行う必要があります
公式チームが互換性の問題を解決するのを待つ必要があるためです
AppDataBase builderの実装
Koin:
AppDataBase builderの実装
Koin:
AppDataBaseの実装
Dao
Entity