I have a simple Room implementation in my app and am having issues with the Dao and RoomDatabase classes upon building the app (Build is failing).
Dao class is 'NoteDao'
@Dao
interface NoteDao {
@Query("SELECT * FROM notes")
suspend fun getAllNotes(): List<Note>
@Query("SELECT * FROM notes WHERE uid = :uid")
suspend fun getNoteByUid(uid: Int): Note
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertNote(note: Note): Long
@Delete
suspend fun deleteNote(note: Note): Int
}
RoomDatabase class
@Database(
entities = [Note::class],
version = 1,
exportSchema = false
)
abstract class AppDatabase : RoomDatabase() {
abstract fun noteDao() : NoteDao
companion object {
@Volatile private var instance: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase =
instance ?: synchronized(this) { instance ?: buildDatabase(context).also { instance = it } }
private fun buildDatabase(appContext: Context) =
Room.databaseBuilder(appContext, AppDatabase::class.java, "NADB")
.fallbackToDestructiveMigration()
.build()
}
}
Note Entity
@Entity(tableName = "notes")
data class Note (
@PrimaryKey(autoGenerate = true)
val uid: Long,
val title: String,
val content: String,
@ColumnInfo(name = "image_url") val imageUrl: String,
@ColumnInfo(name = "created_on") val createdOn: Long,
@ColumnInfo(name = "edited_on") val editedOn: Long
)
Build Output errors -
/Users/KK/StudioProjects/K-K/app/build/generated/source/kapt/debug/com/task/noteapp/data/daos/NoteDao_Impl.java:29: error: duplicate class: com.task.noteapp.data.daos.NoteDao_Impl public final class NoteDao_Impl implements NoteDao {
and
/Users/KK/StudioProjects/K-K/app/build/generated/source/kapt/debug/com/task/noteapp/data/local/AppDatabase_Impl.java:34: error: duplicate class: com.task.noteapp.data.local.AppDatabase_Impl public final class AppDatabase_Impl extends AppDatabase {
followed by -
Execution failed for task ':app:kaptDebugKotlin'. A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction java.lang.reflect.InvocationTargetException (no error message)
Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:kaptDebugKotlin'. Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction Caused by: java.lang.reflect.InvocationTargetException
Caused by: org.jetbrains.kotlin.kapt3.base.util.KaptBaseError: Error while annotation processing
On further investigation, I found the following issues with the respective generated files -
Class 'NoteDao_Impl' must either be declared abstract or implement abstract method 'getAllNotes(Continuation<? super List<? extends Note>>)' in 'NoteDao'
and within this class, the 'getAllNotes()' method had this error -
getAllNotes(Continuation<? super List>)' in 'com.task.noteapp.data.daos.NoteDao_Impl' clashes with 'getAllNotes(Continuation<? super List<? extends Note>>)' in 'com.task.noteapp.data.daos.NoteDao'; both methods have same erasure, yet neither overrides the other
Duplicate class found in the file '/Users/KK/StudioProjects/K-K/app/build/generated/ksp/debug/java/com/task/noteapp/data/local/AppDatabase_Impl.java'
As far as I can see that my implementation of Room is not wrong. However, I can’t figure out the issues.
Dependencies -
def room_version = "2.4.3" implementation "androidx.room:room-runtime:$room_version" implementation "androidx.room:room-ktx:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" kapt "androidx.room:room-compiler:$room_version" ksp "androidx.room:room-compiler:$room_version"
kapt and ksp seems to be in conflict. Removing kapt seems to have solved the issue.
kapt "androidx.room:room-compiler:$room_version"
ksp "androidx.room:room-compiler:$room_version"