Android Kotlin MVVM架构下Room数据库Impl未生成问题求助
Android Kotlin MVVM项目启动时Room实现类缺失问题
我是社区新用户,很高兴在这里结识大家。我的Android Kotlin MVVM项目启动时出现如下Logcat错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.voidcreativestation.toko/com.voidcreativestation.toko.view.MainActivity}: java.lang.RuntimeException: Cannot find implementation for com.voidcreativestation.toko.room.StockQuantityRoom. StockQuantityRoom_Impl does not exist at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6944) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) Caused by: java.lang.RuntimeException: Cannot find implementation for com.voidcreativestation.toko.room.StockQuantityRoom. StockQuantityRoom_Impl does not exist at androidx.room.Room.getGeneratedImplementation(Room.kt:58) at androidx.room.RoomDatabase$Builder.build(RoomDatabase.kt:1356) at com.voidcreativestation.toko.room.StockQuantityRoom$Companion.getDatabase(StockQuantityRoom.kt:64) at com.voidcreativestation.toko.TokoApplication$database$2.invoke(TokoApplication.kt:19) at com.voidcreativestation.toko.TokoApplication$database$2.invoke(TokoApplication.kt:19) at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74) at com.voidcreativestation.toko.TokoApplication.getDatabase(TokoApplication.kt:19) at com.voidcreativestation.toko.TokoApplication$repository$2.invoke(TokoApplication.kt:20) at com.voidcreativestation.toko.TokoApplication$repository$2.invoke(TokoApplication.kt:20) at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74) at com.voidcreativestation.toko.TokoApplication.getRepository(TokoApplication.kt:20) at com.voidcreativestation.toko.view.MainActivity$stockQuantityViewModel$2.invoke(MainActivity.kt:18) at com.voidcreativestation.toko.view.MainActivity$stockQuantityViewModel$2.invoke(MainActivity.kt:17) at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:47) at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:35) at com.voidcreativestation.toko.view.MainActivity.getStockQuantityViewModel(MainActivity.kt:17) at com.voidcreativestation.toko.view.MainActivity.onCreate(MainActivity.kt:30) at android.app.Activity.performCreate(Activity.java:7183) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6944) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
模块级build.gradle配置
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-android' id 'kotlin-kapt' } android { namespace 'com.voidcreativestation.toko' compileSdk 33 defaultConfig { applicationId "com.voidcreativestation.toko" minSdk 24 targetSdk 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } kotlin { jvmToolchain(8) } compileOptions { sourceCompatibility = 1.8 targetCompatibility = 1.8 } kotlinOptions { jvmTarget = '1.8' } packagingOptions { exclude 'META-INF/atomicfu.kotlin_module' } buildFeatures { viewBinding true } } dependencies { implementation 'androidx.core:core-ktx:1.8.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.9.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' implementation "androidx.appcompat:appcompat:$rootProject.appCompatVersion" implementation "androidx.activity:activity-ktx:$rootProject.activityVersion" // Dependencies for working with Architecture components // You'll probably have to update the version numbers in build.gradle (Project) // Room components implementation "androidx.room:room-ktx:$rootProject.roomVersion" kapt "androidx.room:room-compiler:$rootProject.roomVersion" androidTestImplementation "androidx.room:room-testing:$rootProject.roomVersion" implementation "androidx.room:room-runtime:$rootProject.roomVersion" //StackOverflow attempt 1 // Lifecycle components implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$rootProject.lifecycleVersion" implementation "androidx.lifecycle:lifecycle-livedata-ktx:$rootProject.lifecycleVersion" implementation "androidx.lifecycle:lifecycle-common-java8:$rootProject.lifecycleVersion" // Kotlin components api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$rootProject.coroutines" api "org.jetbrains.kotlinx:kotlinx-coroutines-android:$rootProject.coroutines" // UI implementation "androidx.constraintlayout:constraintlayout:$rootProject.constraintLayoutVersion" implementation "com.google.android.material:material:$rootProject.materialVersion" // Testing testImplementation "junit:junit:$rootProject.junitVersion" androidTestImplementation "androidx.arch.core:core-testing:$rootProject.coreTestingVersion" androidTestImplementation ("androidx.test.espresso:espresso-core:$rootProject.espressoVersion", { exclude group: 'com.android.support', module: 'support-annotations' }) androidTestImplementation "androidx.test.ext:junit:$rootProject.androidxJunitVersion" }
根项目build.gradle配置
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext.kotlin_version = '1.5.31' } plugins { id 'com.android.application' version '8.0.2' apply false id 'com.android.library' version '8.0.2' apply false id 'org.jetbrains.kotlin.android' version '1.8.20' apply false } ext { activityVersion = '1.7.2' appCompatVersion = '1.6.1' constraintLayoutVersion = '2.1.4' coreTestingVersion = '2.2.0' coroutines = '1.7.1' lifecycleVersion = '2.6.1' materialVersion = '1.9.0' roomVersion = '2.5.1' // testing junitVersion = '4.13.2' espressoVersion = '3.5.1' androidxJunitVersion = '1.1.5' }
AndroidManifest.xml配置
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application android:name=".TokoApplication" android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Toko" tools:targetApi="31"> <activity android:name=".view.MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
已尝试的修复方案(均未解决)
- 启用kotlin-kapt插件
- 移除StockQuantityRoom中的
.allowMainThreadQueries() - 在getDatabase方法上添加
@JvmStatic注解 - 注释StockQuantityRepository中的
@WorkerThread注解 - 使用官方示例相同版本依赖
- 多次检查命名与变量
- 每次尝试后执行Clean Project和Rebuild Project
- 无效时执行Invalidate Caches
- 参照官方示例重新创建项目
- 添加room-runtime依赖
- 以管理员模式打开IDE并重新构建
- 在StockQuantityRoom的scope.launch后添加(Dispatchers.IO)
恳请各位帮忙解决该问题,谢谢!
内容的提问来源于stack exchange,提问作者K La
相关产品推荐
相关产品推荐

