KC Blog

【Compose Multiplatform】CMPでROOMデータベースを使用する - [KSP2] ネストされた注釈で注釈値が欠けている

4 min read
CrossPlatform#CMP#Kotlin

はじめに

{% include table/compose-multiplatform-category.html %}

重要な注意事項 - 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

参考資料