房间数据库实现没有找到w/Jetpack撰写



我在这里和其他网站都看了一遍,但是我找不到解决办法。

一切工作正常,直到我初始化MainActivity.kt中的RoomViewModel.kt

我一直得到这个错误

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)...

我有这个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"
}

当我添加插件kotlin-androidkotlin-kapt时,它说它们没有找到。因此,我不得不改变应用gradle是这样的(基于其他帖子)

// 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'
}
}
}

但是这会导致这些错误

com/android/build/gradle/BaseExtension
> com.android.build.gradle.BaseExtension

Unable to load class 'com.android.build.gradle.BaseExtension'.

在数据库文件中,我做了如下操作:

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
}
}
}
}

并将所有内容连接到RoomViewModel(我也为它创建了一个工厂)

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)
}
...
}

在MainActivity我做了这个

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")
}

我想上下文有问题,但我真的不知道。仍然在学习…

请帮

这应该有帮助。

现代方式:

plugins块内,

plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt' //Add this
}

Then,在dependencies内,

kapt "androidx.room:room-compiler:$rootProject.roomVersion"

根据下面的评论,

这些都是我需要构建好的


implementation "androidx.room:room-ktx:$rootProject.roomVersion"
kapt "androidx.room:room-compiler:$rootProject.roomVersion"
androidTestImplementation "androidx.room:room-testing:$rootProject.roomVersion"

嘿,等等,你上网了吗?这些可能需要工作室从网上下载(自动下载)。如果没有开始下载,请检查gradle是否配置为离线工作。如果是,切换状态,它就会下载。

根据下面的评论,这似乎已经解决了问题

project-level-build{
dependencies{
classpath 'com.android.tools.build:gradle:7.1.0-alpha04' 
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}