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 之間的相容性所產生的問題。
留言
張貼留言