【问题标题】:Android room persistent: AppDatabase_Impl does not existAndroid 房间持久化:AppDatabase_Impl 不存在
【发布时间】:2018-03-21 19:04:35
【问题描述】:

我的应用数据库类

@Database(entities = {Detail.class}, version = Constant.DATABASE_VERSION)
public abstract class AppDatabase extends RoomDatabase {

    private static AppDatabase INSTANCE;

    public abstract FavoritesDao favoritesDao();

    public static AppDatabase getAppDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE =
                    Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, Constant.DATABASE).allowMainThreadQueries().build();

                    //Room.inMemoryDatabaseBuilder(context.getApplicationContext(),AppDatabase.class).allowMainThreadQueries().build();
        }
        return INSTANCE;
    }

    public static void destroyInstance() {
        INSTANCE = null;
    }
}

Gradle 库:

 compile "android.arch.persistence.room:runtime:+"   
 annotationProcessor "android.arch.persistence.room:compiler:+"

当我询问时它会给出这个错误,AppDatabase_Impl 不存在 在我的应用程序类

public class APp extends Application {

    private boolean appRunning = false;

    @Override
    public void onCreate() {
        super.onCreate();
        AppDatabase.getAppDatabase(this); //--AppDatabase_Impl does not exist

    }   

}

【问题讨论】:

  • 你能提供正确的 logcat 错误吗?
  • 引起:java.lang.RuntimeException:找不到 AppDatabase 的实现。 AppDatabase_Impl 不存在
  • 您是否在 gradle 中提供了房间架构位置?
  • @pratikdeshai 你有没有解决这个问题?我也遇到了同样的问题。
  • 就我而言,我删除了 kotlin 插件来修复它。应用插件:'kotlin-kapt'

标签: java android android-room


【解决方案1】:

使用以下 gradle 链接:

compile 'android.arch.persistence.room:runtime:1.0.0-alpha9'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0-alpha9'

您需要创建一个不同的单例类并从那里获取 AppDatabase,如下所示:

RoomDB.java

public class RoomDB {

private static RoomDB INSTANCE;

public static AppDatabase getInstance(Context context) {
    if (INSTANCE == null) {
        INSTANCE =
                Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, Constant.DATABASE).allowMainThreadQueries().build();

                //Room.inMemoryDatabaseBuilder(context.getApplicationContext(),AppDatabase.class).allowMainThreadQueries().build();
    }
    return INSTANCE;
}

public static void destroyInstance() {
    INSTANCE = null;
}

App.java

public class App extends Application {

private boolean appRunning = false;

@Override
public void onCreate() {
    super.onCreate();
    RoomDB.getInstance(this); //This will provide AppDatabase Instance
}

【讨论】:

  • 我没有创建构造函数,我是通过静态实例直接使用的。
  • 我为房间数据库创建了一个示例项目,您可以在这里查看:github.com/burhanrashid52/Android-Room-Data-Persistent
  • 是的,我更新了,但是同样的错误,AppDatabase_Impl 不存在
  • @pratikdeshai:你修复了那个错误吗??我也遇到同样的错误,因此卡住了。
【解决方案2】:

对于那些使用 Kotlin 的人,请尝试在应用程序中将 annotationProcessor 更改为 kapt build.gradle

例如:

// Extensions = ViewModel + LiveData
implementation "android.arch.lifecycle:extensions:1.1.0"
kapt "android.arch.lifecycle:compiler:1.1.0"
// Room
implementation "android.arch.persistence.room:runtime:1.0.0"
kapt "android.arch.persistence.room:compiler:1.0.0"

还记得添加这个插件

apply plugin: 'kotlin-kapt'

到应用级 build.gradle 文件的顶部并进行清理和重建(根据https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6

在 Android Studio 中,如果您在粘贴代码时或在构建过程中遇到错误,请选择 Build >Clean Project。然后选择 Build > Rebuild Project,然后再次构建。


更新

如果你已经迁移到 androidx

def room_version = "2.3.0" // check latest version from docs

implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"

更新 2(自 2021 年 7 月起)

def room_version = "2.3.0" // check latest version from docs

implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:$room_version"

【讨论】:

  • 非常感谢。刚搬到 Kotlin,我所有的测试用例都开始失败。正在敲我的头。然后不小心看到了这个评论。拯救了我的一天。
  • 还需要在应用层级build.gradle文件的顶部添加apply plugin: 'kotlin-kapt'
  • 这救了我....我认为谷歌应该更多地显示正确的错误...我有 kapt 调用但我没有添加 apply kapt-plugin
  • 从昨天开始就卡住了。多谢。我不明白为什么谷歌的人不在文档中提到这一点。
  • 现在改成implementation "androidx.room:room-ktx:$room_version"
【解决方案3】:

如果您使用kotlin,请将kotlin注解处理器插件添加到应用级别build.gradle

plugins {
    id "org.jetbrains.kotlin.kapt"
}

同时删除 annotationProcessor 并将其替换为 kapt

  • 而不是
dependencies {
    def room_version = "2.3.0"
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"
}
  • 使用
dependencies {
    def room_version = "2.3.0"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
}

annotationProcessor 仅适用于 java 环境。 kapt 负责 java 和 kotlin。如果您的实现有问题,这些插件将在编译时显示它们。

【讨论】:

    【解决方案4】:

    以防万一有人犯和我一样的错误,不要将你的数据库类称为“数据库”,否则你会得到同样的错误。

    【讨论】:

      【解决方案5】:

      除了缺少

      annotationProcessor "android.arch.persistence.room:compiler:x.x.x"

      我也错过了在课堂上添加以下注释

      @Entity(tableName = "mytablename")
      

      【讨论】:

        【解决方案6】:

        对于 Kotlin 开发人员


        如果你检查了 Dao 和 Entity 并且还使用了 Kapt 并且没有问题,如果你使用的是 kotlin 1.4 及更高版本,我猜你的 kotlin 版本有问题。 从 link 更新 Room 到最新版本。


        2.3.0-alpha03 解决了我的问题。

        【讨论】:

          【解决方案7】:

          在 OP 的情况下不是这样,但是当您错误地使用 implementation 而不是 annotationProcessor 时也会发生这种情况:

          implementation "android.arch.persistence.room:compiler:x.x.x"
          

          而不是这个:

          annotationProcessor "android.arch.persistence.room:compiler:x.x.x"
          

          【讨论】:

            【解决方案8】:

            在我的 kotlin 应用程序中,我刚刚在 build.gradle 文件的顶部添加了以下行:

            apply plugin: 'kotlin-kapt'
            

            以及依赖部分中的以下行:

            kapt "androidx.room:room-compiler:2.2.5"
            

            希望它能解决你的问题。

            【讨论】:

              【解决方案9】:

              在此处阅读示例: Room Example

              我只是使用正确的(我猜是的)annotationProcessorFile 修复了这个错误,如下:

              annotationProcessor "android.arch.persistence.room:compiler:<latest_version>"
              

              另外,我在 Room 版本和 Lifecycle 版本中都升级到了 2.2.0。

              同步 graddle 后,我可以开始使用 Room。

              那么,祝你好运!让代码随身携带!

              【讨论】:

                【解决方案10】:

                对我来说,只要您包含任何与 Room 数据库相关的导入,Android Studio 就会自动更新依赖项。但是根据https://developer.android.com/jetpack/androidx/releases/room#declaring_dependencies,您需要更新一些。这是我的代码库的样子:

                AppDatabase.kt

                import android.content.Context
                import androidx.room.Database
                import androidx.room.Room
                import androidx.room.RoomDatabase
                
                @Database(entities = arrayOf(MyEntity::class), version = 1)
                abstract class AppDatabase : RoomDatabase() {
                    abstract fun myDAO(): MyDAO
                
                    companion object {
                        @Volatile private var instance: AppDatabase? = null
                        private val LOCK = Any()
                
                        operator fun invoke(context: Context)= instance ?: synchronized(LOCK){
                            instance ?: buildDatabase(context).also { instance = it}
                        }
                
                        private fun buildDatabase(context: Context) = Room.databaseBuilder(context,
                            AppDatabase::class.java, "db-name.db")
                            .build()
                    }
                }
                

                按照答案之一更新 build.gradle:

                apply plugin: 'kotlin-kapt' // this goes with other declared plugin at top
                dependencies { // add/update the following in dependencies section
                    implementation 'androidx.room:room-runtime:2.2.3'
                //    annotationProcessor 'androidx.room:room-compiler:2.2.3' // remove this and use the following
                    kapt "androidx.room:room-compiler:2.2.3"
                
                }
                

                同步 gradle 就可以了。

                【讨论】:

                  【解决方案11】:

                  更改我的 gradle 文件中的依赖项并没有帮助我修复错误。我在初始化 Room 数据库的类中错过了这个数据库注释,这导致了这个问题。

                  @Database(entities = [UserModel::class], version = 1)

                  确保上面注解中指定的实体模型是指特定的模型类

                  【讨论】:

                  • 这是我错过的
                  【解决方案12】:

                  如果您使用 kotlin 类来实现数据库,那么 使用

                  apply plugin: 'kotlin-kapt'
                  

                  kapt "android.arch.persistence.room:compiler:1.1.1"
                  

                  在你的 gradle 文件中,它会起作用。

                  【讨论】:

                  • 这适用于Android Studio 3.5(但是当前的房间编译器版本是2.1.0)
                  • 我认为大多数人在整个项目中都没有使用 androidx 库...这就是我建议 1.1.1 的原因...我自己也遇到了编译问题,并且对使用旧版本进行的最小更改感到安全。
                  【解决方案13】:

                  这个问题已经很老了,但我今天偶然发现了这个问题,提供的答案都没有帮助我。最后我注意到googledocumentation实际上仍然被Java而不是Kotlin默认采用,实际上他们添加了一条我忽略的评论

                  对于 Kotlin,使用 kapt 代替 annotationProcessor

                  所以,而不是

                  annotationProcessor "androidx.room:room-compiler:$room_version"

                  如果您使用 Kotlin 进行开发,您应该使用:

                      kapt "androidx.room:room-compiler:$room_version"
                  

                  【讨论】:

                    【解决方案14】:

                    确保在 build.gradle 中为 room 添加正确的依赖项

                    ext {
                       roomVersion = '2.1.0-alpha06'
                    }
                    
                    // Room components
                    implementation "androidx.room:room-runtime:$rootProject.roomVersion"
                    implementation "androidx.room:room-ktx:$rootProject.roomVersion"
                    kapt "androidx.room:room-compiler:$rootProject.roomVersion"
                    androidTestImplementation "androidx.room:room-testing:$rootProject.roomVersion"
                    

                    在顶部的下方-

                    apply plugin: 'kotlin-kapt'
                    

                    【讨论】:

                      【解决方案15】:

                      同样的现象也发生在我身上。

                      关注

                      implementation "android.arch.persistence.room:runtime:1.1.1"
                      

                      添加会导致另一个构建错误,但会从日志中跟踪原因。

                      在我的例子中,SQL 实现中有一个错误。 修复后构建成功。

                      因此您可能想要检查整个房间库的实现,而不是查看崩溃的本地。

                      【讨论】:

                        【解决方案16】:

                        问题更多在于未包含在 gradle 构建中的正确库。我有一个类似的问题并添加了丢失的

                        testImplementation "android.arch.persistence.room:testing:$room_version

                        【讨论】:

                          【解决方案17】:

                          遇到了同样的问题。实现了 Android Studio 创建的一个新示例项目中正式告知的少数类和接口: https://developer.android.com/training/data-storage/room/

                          上面提到的所有解决方案都没有帮助,根据我的数据库类,必要的 _Impl 文件不是由 Room 生成的。最后在终端执行 gradle clean build 给了我导致解决方案的提示:

                          “警告:模式导出目录未提供给注释处理器,因此我们无法导出模式。您可以提供room.schemaLocation 注释处理器参数或将 exportSchema 设置为 false。”

                          我在数据库类中添加了参数exportSchema = false

                          @Database(entities = arrayOf(User::class), version = 1, exportSchema = false)
                          abstract class AppDatabase : RoomDatabase() {
                              abstract fun userDao(): UserDao
                          }
                          

                          然后就成功了,在generateJava下的app模块中找到了这两个生成的文件:

                          • AppDatabase_Impl
                          • UserDao_Impl

                          我不理解这种行为,因为据说该参数是可选的,请参阅 https://stackoverflow.com/a/44645943/3258117

                          【讨论】:

                          • 从终端运行 ./gradlew clean build 是关键。对我来说,我收到了这条消息:app: 'annotationProcessor' 依赖项不会被识别为 kapt 注释处理器。请将这些工件的配置名称更改为 'kapt':'android.arch.lifecycle:compiler:1.1.1' 并应用 kapt 插件:“apply plugin:'kotlin-kapt'”。
                          • 啊,是的,过去在终端中执行任务对我也有很大帮助。 IDE 中的构建工具消息通常会“隐藏”原始错误消息
                          【解决方案18】:

                          随便用

                          apply plugin: 'kotlin-kapt'
                          

                          在应用程序 build.gradle 中

                          并将两者都保留在依赖项中

                          annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomVersion"
                          kapt "android.arch.persistence.room:compiler:$rootProject.roomVersion"
                          

                          编辑

                          在较新的版本中不需要同时添加两个依赖项 随便用吧,希望有用。

                          kapt 'android.arch.persistence.room:compiler:1.1.1'
                          

                          【讨论】:

                            【解决方案19】:

                            我遇到了这个问题,因为我忘记了@Dao注解

                            @Dao
                            public interface SearchHistoryDao {
                                @Query("SELECT * FROM search_history")
                                List<SearchHistory> getAll();
                            
                                @Insert
                                void insertAll(SearchHistory... histories);
                            
                                @Delete()
                                void delete(SearchHistory history);
                            }
                            

                            Room Official tutorial

                            【讨论】:

                            • 我也忘记了。谢谢 :) 但仍然崩溃 :(
                            • 通过添加 kapt 修复
                            【解决方案20】:

                            对于 Kotlin 开发人员

                            使用这个:

                            implementation "android.arch.persistence.room:runtime:1.0.0"
                            kapt "android.arch.persistence.room:compiler:1.0.0"
                            

                            并将apply plugin: 'kotlin-kapt' 添加到应用级别的顶部build.gradle

                            面向 Java 开发人员

                            implementation "android.arch.persistence.room:runtime:1.0.0"
                            annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
                            

                            【讨论】:

                            • 不同的答案!
                            • 这家伙怎么不一样?
                            【解决方案21】:

                            在我的例子中,我正在测试房间数据库的连接性,并且我已将测试类放在我在 AndroidTest 文件夹中创建的目录中。我已将其移出自定义目录,然后效果很好。

                            【讨论】:

                            • 这也是我的问题。知道为什么会发生这种情况以及如何避免这种情况吗?我宁愿在发布代码中不要有TestDatabase
                            【解决方案22】:

                            我错过了这个错误

                            @Database(entity="{<model.class>})
                            

                            确保上面注解中指定的实体模型引用了特定的模型类,并确保必要的注解:

                            @Entity(tableName = "<table_name>" ...)
                            

                            定义正确,你会很好

                            【讨论】:

                            • 为了清楚起见,这直接位于 DB 类定义之上。它似乎解决了我的问题 - 谢谢!
                            • 确保您的实体中没有空构造函数 (constructor(){}) stackoverflow.com/a/60494924/6148931
                            • 我遇到了这个问题,将 build.gradle 更改为接受的答案并没有解决问题。添加这个注解解决了这个问题,但是在the tutorial I was following 中,“用户”类只有@Entity,没有@Entity(tablename="table name" )。如果需要,为什么教程缺少这个注解?
                            【解决方案23】:

                            这不仅仅是更新您的依赖项。确保所有 Room 依赖项具有相同的版本。

                            implementation 'android.arch.persistence.room:rxjava2:1.1.0-alpha2'
                            implementation 'android.arch.persistence.room:runtime:1.1.0-alpha2'
                            annotationProcessor "android.arch.persistence.room:compiler:1.1.0-alpha2"
                            

                            在上面的示例 sn-p 中,我所有的 Room 依赖项都具有相同的版本 1.1.0-alpha2

                            【讨论】:

                              【解决方案24】:

                              我遇到这个问题是因为我忘记了apt依赖

                              implementation "android.arch.lifecycle:extensions:$archLifecycleVersion"
                              implementation "android.arch.persistence.room:runtime:$archRoomVersion"
                              annotationProcessor "android.arch.lifecycle:compiler:$archLifecycleVersion"
                              annotationProcessor "android.arch.persistence.room:compiler:$archRoomVersion"
                              

                              添加annotationProcessor后,重新构建,问题解决。

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2018-01-22
                                • 2018-03-30
                                • 1970-01-01
                                • 2018-05-27
                                • 1970-01-01
                                相关资源
                                最近更新 更多