当前位置: 首页 > 知识库问答 >
问题:

未找到带有Jetpack Compose的房间数据库实现

子车青青
2023-03-14

我环顾了这里和其他网站,但我想不出解决办法。

一切正常,直到我初始化Main Activity.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)...

我有这个格里德尔

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时,它说它们找不到。

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

这是我做的

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

我认为上下文有问题,但我真的不知道。还在学习。。。

请帮帮忙

共有1个答案

仇正平
2023-03-14

这应该会有所帮助。

现代方法:

插件块中,

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

然后,使用依赖关系

    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"
 }
} 
 类似资料:
  • 我是Android开发新手,需要为大学建立我的第一个项目。大学用的是旧版本的XML和Java,但是我想学Compose,所以我学了Kotlin。 现在,在设置好一切之后,我试图使用hiltViewModel()方法将视图模型注入到可组合函数中,但我得到了一个错误。我看了这个教程:https://www.youtube.com/watch?v=A7CGcFjQQtQ 在让这个工作之后。现在它说找不到

  • 当我试图构建我的应用程序时,我遇到了以下编译错误: 持久性模块在Android设置中是独立的。 建筑格拉德尔 ext.androidXRoom=“2.1.0-alpha02” 我试着把kotlin版本,room版本,改回AndroidArch room,但没用。我还尝试了清理项目和使Android Studio的缓存失效。但它不起作用。 编辑:AppDatabase源

  • 从一个使用spring、JPA和JDBC连接到mysql数据库的程序开始,我试图将该应用程序配置为在嵌入式模式下使用H2数据库。 使用MYSQL一切正常,但使用H2则不然。 我无法让H2返回任何记录,尽管记录在那里,所以如果我通过JDBC进行相同的查询,如果我看到它们。 我的配置如下: 因此,如果我编写以下代码: 当我使用JDBC时,如果记录存在,我会在日历表中看到它,但当使用JPA时,它似乎没有

  • 错误:查询有问题:[SQLITE_ERROR]SQL错误或缺少数据库(没有这样的表:任务) 显示了这个错误,我怎么可能修复它? 我正在学习这个教程

  • 并且我发现了基于数据库版本4的可能场景的迁移varargs。 我的问题是,假设我使用的是db v1的Room,当我的应用程序到达db v10时,我将不得不编写多少迁移方法? 在sqlite中,我们在中获得已安装应用程序的当前db版本,我们只需通过开关大小写而不使用break语句,以便满足所有db升级。

  • 我是新来的和我试图我的得到一个从它。我试图这样做的它与这是id但问题是我不知道如何返回目标从。 这就是<代码>刀 这是Repository类