Android - error: Type of the parameter must be a class annotated with @Entity or a collection/array of it.

使用 room v2.5.2 遇上了標題的錯誤。

error: Type of the parameter must be a class annotated with @Entity or a collection/array of it.

網路上查了一下,似乎是 Kotlin 與 Room 版本的相容性所產生的問題。

 

發生錯誤的程式碼如下。

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(packageTag: PackageTag)

build 出來的程式碼如下。

@androidx.room.Insert(onConflict = 1)
@org.jetbrains.annotations.Nullable
public abstract java.lang.Object insert(@org.jetbrains.annotations.NotNull
com.javahand.packagetag.model.PackageTag packageTag, @org.jetbrains.annotations.NotNull
kotlin.coroutines.Continuation<? super kotlin.Unit> $completion);

Android Studio 指出錯誤是發生在 build 出來的程式碼的最後一行的 $completion。

網路上看了一些資訊,都沒有看到比較確切的解決方案。

 

因為此專案 Kotlin 使用了最新的 v1.9.0,於是嘗試把 Kotlin 降版。

https://kotlinlang.org/docs/releases.html#release-details

把 Kotlin 降回 1.8.22 再重新 build。

在 build 時,又遇上了新的問題,如下。

Execution failed for task ':app:kaptGenerateStubsDebugKotlin'.
> 'compileDebugJavaWithJavac' task (current target is 1.8) and 'kaptGenerateStubsDebugKotlin' task (current target is 17) jvm target compatibility should be set to the same Java version.

網路上查了一下,似乎也沒有看到比較確切的解決方案。

gradle 中,原來的設定如下。

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}

錯誤訊息中說要 17,於是嘗試如下的設定值。

compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}

最後 build 成功也能執行無誤。


再嘗試把 Kotlin 版本改為 1.9.0,build 看看。

出現一樣的錯誤。

所以,應該就是 Kotlin 與 Room 之間的相容性所產生的問題。

留言

這個網誌中的熱門文章

泰文子音與字形之間的變化

AUTOMAXX UP-5HX 使用心得