You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:35:52