Jetpack Compose中Room数据库创建及跨屏使用启动崩溃问题求助
问题:Kotlin+Jetpack Compose应用启动崩溃,Room数据库实现类找不到
使用Kotlin+Jetpack Compose开发应用时启动崩溃,Logcat提示找不到AppDatabase的实现类MainActivity_AppDatabase_Impl。相关代码、日志及配置如下:
数据库页面代码
@Composable fun DatabaseScreen( navController: NavController, sliderValue: Float, userRepository: UserRepository ) { var userCount by remember { mutableStateOf(0) } var resultText by remember { mutableStateOf("") } Column( modifier = Modifier .fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Button( onClick = { CoroutineScope(Dispatchers.IO).launch { val startTime = System.nanoTime() for (i in 0 until (sliderValue * sliderValue * 10).toInt()) { val age = i % 17 + 1 userRepository.insertUser(User(age = age)) } val endTime = System.nanoTime() val duration = endTime - startTime // Update UI on the main thread withContext(Dispatchers.Main) { resultText = "Added users: ${(sliderValue * sliderValue * 10).toInt()} in $duration nanoseconds" } } } ) { Text(text = "Add Users") } } }
数据库相关类
@Entity(tableName = "user") data class User( @PrimaryKey(autoGenerate = true) val id: Long = 0, val age: Int ) @Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao } @Dao interface UserDao { @Insert suspend fun insertUser(user: User) @Query("SELECT * FROM user") suspend fun getAllUsers(): List<User> @Query("DELETE FROM user") suspend fun clearDatabase() } class UserRepository(private val userDao: UserDao) { suspend fun insertUser(user: User) { userDao.insertUser(user) } suspend fun getAllUsers(): List<User> { return userDao.getAllUsers() } suspend fun clearDatabase() { userDao.clearDatabase() } }
MainActivity代码
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val database = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "my_database" ).build() val userRepository = UserRepository(database.userDao()) setContent { var navController = rememberNavController() NavHost(navController = navController, startDestination = "mainScreen") { composable("mainScreen") { MyApp(navController) } composable("Screen0") { UIScreen(navController, 5f) } composable("Screen1") { AnimationScreen(navController, 5f) } composable("Screen2") { ArithmeticLogicalScreen(navController, 4f) } composable("Screen3") { DatabaseScreen(navController, 5f,userRepository) } composable("Screen4") { FeaturesScreen(navController, 5f) } } } }
Logcat日志
FATAL EXCEPTION: main Process: com.example.jurajappjetpack, PID: 9583 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.jurajappjetpack/com.example.jurajappjetpack.MainActivity}: java.lang.RuntimeException: Cannot find implementation for com.example.jurajappjetpack.MainActivity.AppDatabase. MainActivity_AppDatabase_Impl does not exist at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: java.lang.RuntimeException: Cannot find implementation for com.example.jurajappjetpack.MainActivity.AppDatabase. MainActivity_AppDatabase_Impl does not exist at androidx.room.Room.getGeneratedImplementation(Room.kt:58) at androidx.room.RoomDatabase$Builder.build(RoomDatabase.kt:1357) at com.example.jurajappjetpack.MainActivity.onCreate(MainActivity.kt:125) at android.app.Activity.performCreate(Activity.java:7136) at android.app.Activity.performCreate(Activity.java:7127) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893) ...
项目配置
项目级build.gradle
plugins { id("com.android.application") version "8.1.1" apply false id("org.jetbrains.kotlin.android") version "1.8.10" apply false }
模块级build.gradle
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") } android { namespace = "com.example.jurajappjetpack" compileSdk = 33 defaultConfig { applicationId = "com.example.jurajappjetpack" minSdk = 28 targetSdk = 33 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary = true } } buildTypes { release { isMinifyEnabled = 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.4.3" } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } } dependencies { implementation("androidx.core:core-ktx:1.9.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") implementation("androidx.activity:activity-compose:1.7.0") implementation(platform("androidx.compose:compose-bom:2023.03.00")) implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.material3:material3") implementation("com.google.android.material:material:1.9.0") implementation("androidx.room:room-ktx:2.5.2") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) androidTestImplementation("androidx.compose.ui:ui-test-junit4") debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-test-manifest") implementation ("androidx.navigation:navigation-compose:2.4.0") implementation("androidx.compose.animation:animation-core") implementation ("com.google.android.gms:play-services-location:18.0.0") implementation ("androidx.activity:activity-ktx:1.3.1") implementation ("androidx.fragment:fragment-ktx:1.4.0") implementation ("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0") implementation ("androidx.camera:camera-camera2:1.1.0-beta01") implementation ("androidx.camera:camera-lifecycle:1.1.0-beta01") implementation ("androidx.room:room-runtime:2.5.2") annotationProcessor ("androidx.room:room-compiler:2.5.2") }
解决方案
1. 替换Room注解处理器为Kapt
Kotlin项目中Room需要使用kapt而非annotationProcessor生成实现类,修改模块级build.gradle:
- 在plugins块添加kapt插件:
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("kotlin-kapt") // 添加此行 }
- 替换注解处理器依赖:
// 替换原annotationProcessor行 kapt("androidx.room:room-compiler:2.5.2")
2. 将AppDatabase改为顶级类
从日志可见AppDatabase是MainActivity的内部类,Room对内部类生成实现类存在兼容性问题,将AppDatabase、User、UserDao移至单独文件或作为顶级类(脱离MainActivity内部)。
3. 清理重建项目
修改配置后执行:
- 点击工具栏
Build->Clean Project - 再点击
Build->Rebuild Project - 可选重启Android Studio避免缓存干扰
4. 清理重复依赖
模块级build.gradle存在重复依赖(如lifecycle-runtime-ktx、activity-ktx有多个版本),统一保留最新版本:
// 保留最新版本,删除旧版本依赖 implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") implementation("androidx.activity:activity-compose:1.7.0") // 删除以下两行 // implementation ("androidx.activity:activity-ktx:1.3.1") // implementation ("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0")
内容的提问来源于stack exchange,提问作者jurepure123
相关产品推荐
相关产品推荐

