I have looked around here and other sites, but I can't figure out the solution.
everything worked fine till I initialized the RoomViewModel.kt in MainActivity.kt.
I keep getting this error
java.lang.RuntimeException: cannot find implementation for com.caller.fakecaller.data.DataBase. DataBase_Impl does not exist
at androidx.room.Room.getGeneratedImplementation(Room.java:97)
at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:1358)
at com.caller.fakecaller.data.DataBase$Companion.getInstance(DataBase.kt:31)
at com.caller.fakecaller.data.RoomViewModel.<init>(RoomViewModel.kt:18)
at com.caller.fakecaller.util.RoomViewModelFactory.create(RoomViewModelFactory.kt:14)...
I have this gradle
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
compileSdk 31
defaultConfig {
applicationId "com.caller.fakecaller"
minSdk 21
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary true
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
compose true
}
composeOptions {
kotlinCompilerExtensionVersion '1.0.2'
}
packagingOptions {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.6.0'
implementation "androidx.compose.ui:ui:1.0.2"
implementation "androidx.compose.material:material:1.0.2"
implementation "androidx.compose.ui:ui-tooling-preview:1.0.2"
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
implementation 'androidx.activity:activity-compose:1.3.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.0.2"
debugImplementation "androidx.compose.ui:ui-tooling:1.0.2"
//Room
implementation "androidx.room:room-runtime:2.3.0"
annotationProcessor "androidx.room:room-compiler:2.3.0"
// optional - Kotlin Extensions and Coroutines support for Room
implementation("androidx.room:room-ktx:2.3.0")
// Lifecycle components
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-common-java8:2.3.1"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
//Navigation with Compose
implementation("androidx.navigation:navigation-compose:2.4.0-alpha08")
//Preferences
implementation("androidx.preference:preference-ktx:1.1.1")
//Activity
implementation 'androidx.activity:activity-ktx:1.4.0-alpha01'
//Glide Accompanist
implementation "dev.chrisbanes.accompanist:accompanist-glide:0.4.2"
}
when i added the plugins kotlin-android and kotlin-kapt it said that they weren't found.
therefore i had to change the app gradle to be like this (based on other posts)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
task clean(type: Delete) {
delete rootProject.buildDir
}
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30"
}
}
allprojects {
configurations.all {
resolutionStrategy {
cacheChangingModulesFor 0, 'seconds'
}
}
}
but that gave me these errors
com/android/build/gradle/BaseExtension
> com.android.build.gradle.BaseExtension
Unable to load class 'com.android.build.gradle.BaseExtension'.
in the database file I did as follows:
private const val DATABASE_NAME = "FakeCaller"
@Database(entities = [Contact::class, RingTone::class], version = 1, exportSchema = false)
abstract class DataBase:RoomDatabase() {
abstract fun UserDao(): UserDao
abstract fun RingDao():RingDao
//Implementing the DataBase
companion object {
@Volatile
private var INSTANCE: DataBase? = null
fun getInstance(context: Context): DataBase {
synchronized(this) {
var instance = INSTANCE
if (instance == null) {
instance = Room.databaseBuilder(
context.applicationContext,
DataBase::class.java,
DATABASE_NAME
).build()
INSTANCE = instance
}
return instance
}
}
}
}
and connected everything to the RoomViewModel (I created a factory for it also)
class RoomViewModel(application: Application) : AndroidViewModel(application) {
val readContactList : LiveData<List<Contact>>
val readFileUri: LiveData<Uri>
private val repository : Repository
init {
val dbInstance = DataBase.getInstance(application)
val userDao = dbInstance.UserDao()
val ringDao = dbInstance.RingDao()
repository = Repository(userDao, ringDao)
readContactList = repository.getContacts
readFileUri = repository.getUri()
}
suspend fun getContact(id:Long): LiveData<Contact>{
return repository.getContact(id)
}
...
}
in MainActivity I made this
setContent {
FakeCallerTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colors.background
) {
val context = LocalContext.current
val roomViewModel: RoomViewModel = viewModel(
factory = RoomViewModelFactory(context.applicationContext as Application)
)
Greeting("Android")
}
i think there is an issue with the context but i don't know really. still learning...
please help
applicationContextjust like that. Do not invoke LocalContext here since as long as you are within the Activity bounds, you can reference Activity properties just like that. - MARSK