I'm using Hilt
as Dependency Injection
to inject Room
, ViewModel
, Repositories
, and other components but I'm getting the following exception while injecting Database
module.
Exception
Caused by: java.lang.RuntimeException: cannot find implementation for
com.qst.qstmoviesapp.db.MovieDatabase. MovieDatabase_Impl does not exist
at androidx.room.Room.getGeneratedImplementation(Room.java:100)
at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:1486)
at com.qst.qstmoviesapp.di.DatabaseModule.provideDatabase(DatabaseModule.kt:28)
atcom.qst.qstmoviesapp.di.DatabaseModule_ProvideDatabaseFactory.provideDatabase(DatabaseModule_ProvideDatabaseFactory.java:37)
at com.qst.qstmoviesapp.DaggerMovieApp_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider.get(DaggerMovieApp_HiltComponents_SingletonC.java:656)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:47) at
com.qst.qstmoviesapp.DaggerMovieApp_HiltComponents_SingletonC$SingletonCImpl.movieDao(DaggerMovieApp_HiltComponents_SingletonC.java:610)
atcom.qst.qstmoviesapp.DaggerMovieApp_HiltComponents_SingletonC$SingletonCImpl.access$1700(DaggerMovieApp_HiltComponents_SingletonC.java:594)
at com.qst.qstmoviesapp.DaggerMovieApp_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider.get(DaggerMovieApp_HiltComponents_SingletonC.java:653) at
dagger.internal.DoubleCheck.get(DoubleCheck.java:47) atcom.qst.qstmoviesapp.DaggerMovieApp_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider.get(DaggerMovieApp_HiltComponents_SingletonC.java:518) at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory$1.create(HiltViewModelFactory.java:104)
at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:89)
at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:116)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:53)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:35)
at com.qst.qstmoviesapp.ui.MovieFragment.getMovieViewModel(MovieFragment.kt:30)
ViewModel.kt
@HiltViewModel
class MovieViewModel @Inject constructor(
private val movieRepository: MovieRepository
): ViewModel(){
val movies = movieRepository.movies
}
Repository
@Singleton
class MovieRepository @Inject constructor(movieDao: MovieDao) {
val movies: LiveData<List<Movie>> = movieDao.getMovies()
}
Database Module
@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {
@Provides
fun provideMovieDao(movieDatabase: MovieDatabase) = movieDatabase.movieDao()
@Singleton
@Provides
fun provideDatabase(@ApplicationContext context: Context): MovieDatabase {
return Room.databaseBuilder(
context,
MovieDatabase::class.java,
"qst_movies.db")
.build()
}
}
Movie DAO
@Dao
interface MovieDao {
@Query("SELECT * FROM movies")
fun getMovies(): LiveData<List<Movie>>
}
Movie Database
@Database(entities = arrayOf(Movie::class), version = 1, exportSchema = false)
abstract class MovieDatabase: RoomDatabase(){
abstract fun movieDao(): MovieDao
}
Fragment
@AndroidEntryPoint
class MovieFragment : Fragment() {
private var _binding: FragmentMovieBinding? = null
private val binding get() = _binding!!
@Inject lateinit var movieAdapter: MoviesAdapter
val movieViewModel: MovieViewModel by viewModels()
}
dependencies from app/build.gradle
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.5.0'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation "androidx.fragment:fragment-ktx:1.5.2"
implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1'
implementation 'androidx.navigation:navigation-ui-ktx:2.4.1'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
implementation("com.google.dagger:hilt-android:2.44")
kapt("com.google.dagger:hilt-android-compiler:2.44")
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.4'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
implementation 'com.github.bumptech.glide:glide:4.14.2'
annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2'
implementation "androidx.recyclerview:recyclerview:1.2.0-alpha06"
implementation platform('com.google.firebase:firebase-bom:31.1.1')
implementation 'com.google.firebase:firebase-firestore-ktx'
implementation("androidx.room:room-runtime:2.4.3")
annotationProcessor("androidx.room:room-compiler:2.4.3")
}
Can someone please point out what might be missing? Thanks!