【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を正常にセットアップするには、回避策を使用する必要があります
    公式の解決策が出るまで、以下の方法を参照できます


    以下に方法を提供します
    参考にしてください

    また、他の開発者がすでに公式チームに問題を報告しているのも確認しました:

実装
インポート - Kotlinバージョン1.9の場合
  • ステップ1. Roomをインポート
    • .tomlファイルに以下を追加:

    • build.gradle.ktsにプラグインを追加:

    • build.gradle.ktsにライブラリを追加:

    • build.gradle.ktsの外層に以下のコードを追加:

    • Kotlinのバージョンが1.9.20より大きい場合、gradle.propertiesに以下を追加:

インポート - Kotlinバージョン2.0.0の場合
  • ステップ1. kspバージョンを変更:

  • ステップ2. build.gradle.ktsを調整:
    • kotlinブロックにbuild/generated/ksp/metadataを追加
    • addメソッドを使用してkspをインポート
    • 外層にtasks.withTypeを追加
  • ステップ3. 回避策を使用してRoomDatabaseを実装

    これは現在の回避策です
    Kotlin 2.0.0を使用している場合は、これを行う必要があります
    公式チームが互換性の問題を解決するのを待つ必要があるためです
実際のRoomの使用
Android Main

AppDataBase builderの実装

Koin:

iOS Main

AppDataBase builderの実装

Koin:

Common Main

AppDataBaseの実装

Dao

Entity

参考資料

You might also enjoy