【错误记录】Android 中使用 Room 框架访问数据库报错 ( cannot find implementation for xx.xxDatabase. xxDatabase_Impl )

2023-10-11 16:32:38 浏览数 (4)

一、报错信息

在 Android 中 , 使用 Room 数据库访问框架操作数据库 , 运行是报如下错误 ;

核心报错信息 : cannot find implementation for xx.xxDatabase. xxDatabase_Impl does not exist

代码语言:javascript复制
cannot find implementation for kim.hsl.roomdemo.StudentDatabase. StudentDatabase_Impl does not exist

完整报错信息 :

代码语言:javascript复制
2023-05-10 15:22:18.829 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: kim.hsl.roomdemo, PID: 27608
    java.lang.RuntimeException: Unable to start activity ComponentInfo{kim.hsl.roomdemo/kim.hsl.roomdemo.MainActivity}: java.lang.RuntimeException: cannot find implementation for kim.hsl.roomdemo.StudentDatabase. StudentDatabase_Impl does not exist
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4631)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4842)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:113)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2928)
        at android.os.Handler.dispatchMessage(Handler.java:117)
        at android.os.Looper.loopOnce(Looper.java:205)
        at android.os.Looper.loop(Looper.java:293)
        at android.app.ActivityThread.main(ActivityThread.java:9596)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1204)
     Caused by: java.lang.RuntimeException: cannot find implementation for kim.hsl.roomdemo.StudentDatabase. StudentDatabase_Impl does not exist
        at androidx.room.Room.getGeneratedImplementation(Room.java:94)
        at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:952)
        at kim.hsl.roomdemo.StudentDatabase$Companion.inst(StudentDatabase.kt:29)
        at kim.hsl.roomdemo.MainActivity.onCreate(MainActivity.kt:18)
        at android.app.Activity.performCreate(Activity.java:8488)
        at android.app.Activity.performCreate(Activity.java:8461)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1343)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4602)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4842) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:113) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2928) 
        at android.os.Handler.dispatchMessage(Handler.java:117) 
        at android.os.Looper.loopOnce(Looper.java:205) 
        at android.os.Looper.loop(Looper.java:293) 
        at android.app.ActivityThread.main(ActivityThread.java:9596) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1204) 

二、解决方案


出现上述问题 , 只可能有两个方向出错 :

  • 依赖配置错误 : 没有正确配置 Room 依赖 ;
  • 注解使用错误 : 写代码时 , 没有写对

如果使用的是 Kotlin 语言开发 , 导入依赖库时 , 需要使用 kapt 导入注解处理器 ;

代码语言:javascript复制
    // 导入 Room 依赖库
    implementation 'androidx.room:room-runtime:2.2.5'
    // 导入注解处理器
    kapt 'androidx.room:room-compiler:2.2.5'

如果使用的是 Java 语言开发 , 则在导入依赖库时 , 需要使用 annotationProcessor 导入注解处理器 ;

代码语言:javascript复制
    // 导入 Room 依赖库
    implementation 'androidx.room:room-runtime:2.2.5'
    // 导入注解处理器
    //annotationProcessor 'androidx.room:room-compiler:2.2.5'

上述问题的错误就是使用 Kotlin 语言开发 , 使用 annotationProcessor 导入注解处理器 ;

三、注解使用错误


出现上述问题 , 只可能有两个方向出错 :

  • 依赖配置错误 : 没有正确配置 Room 依赖 ;
  • 注解使用错误 : 写代码时 , 没有写对

下面分析注解使用错误 :

检查是否使用了正确的注解来标记 Room 数据库、实体和 DAO。

在代码中,应该使用 @Database、@Entity 和 @Dao 等注解来标记相应的类和接口。

检查 Room 数据库的实现类是否生成成功。

在 Android Studio 中,可以查看项目的 app/build/generated/source/kapt/debug 目录,检查是否有名为 StudentDatabase_Impl 的 Java 类文件。

如果该文件不存在,则可能是由于 Room 的 kapt 编译过程出现了错误,需要查看编译日志并修复相应的错误。

四、检查代码混淆错误

如果您的项目使用了混淆或压缩功能,需要在 proguard 文件中添加 Room 相关的规则,以避免混淆 Room 相关的类和接口。在混淆规则中,可以添加以下代码:

代码语言:javascript复制
-keep class kim.hsl.roomdemo.StudentDatabase { *; }
-keepclassmembers class kim.hsl.roomdemo.StudentDatabase { *; }
-keep class kim.hsl.roomdemo.StudentDatabase$* { *; }
-keepclassmembers class kim.hsl.roomdemo.StudentDatabase$* { *; }

-keep class kim.hsl.roomdemo.Student { *; }
-keepclassmembers class kim.hsl.roomdemo.Student { *; }
-keep class kim.hsl.roomdemo.Student$* { *; }
-keepclassmembers class kim.hsl.roomdemo.Student$* { *; }

-keep interface kim.hsl.roomdemo.StudentDao { *; }
-keepclassmembers interface kim.hsl.roomdemo.StudentDao { *; }

这些规则将保留 Room 相关的类和接口,避免混淆或压缩导致的问题。

如果以上方法都不能解决问题,可以尝试清除项目并重新构建,或者使用 Android Studio 中的 Invalidate Caches / Restart 功能来尝试解决问题。

1 人点赞