持续的Android会议室:AppDatabase_Impl不存在


147

我的应用程式资料库类别

@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 lib:

 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错误吗?
Debanjan '17

1
原因:java.lang.RuntimeException:找不到AppDatabase的实现。AppDatabase_Impl不存在
Pratik deshai

您是否在gradle中提供了房间架构位置?
Debanjan '17

1
@pratikdeshai您对此问题有任何解决方案吗?我也有同样的问题。
克鲁纳尔

就我而言,我删除了kotlin插件以进行修复。应用插件:“ kotlin-kapt”
拿破仑

Answers:


303

对于那些使用Kotlin的人,请尝试在应用中更改annotationProcessorkaptbuild.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。然后选择“构建”>“重建项目”,然后再次进行构建。


更新

如果您已迁移到androidx

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

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

2
非常感谢。只是搬到Kotlin,我的所有测试用例都开始失败。在敲我的头。然后我不小心看到了这个评论。拯救了我的一天。
Ozeetee

77
还需要添加apply plugin: 'kotlin-kapt'到应用程序级别build.gradle文件的顶部
daka

1
这救了我....我认为Google应该在显示正确的错误上做更多的工作...我有kapt调用,但是我没有添加apply kapt-plugin
anoop4real

从昨天开始就被卡住了。非常感谢。我不明白为什么Google员工不会在文档中提及这一点。
Shubham Anand

你就是山羊,用快速的gradle修复救了我
Fanadez

82

只需使用

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'

22

我错过了这个错误

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

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

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

被正确定义,你会很好


1
为了清楚起见,它紧邻DB类定义。看来已经解决了我的问题-谢谢!
Winwaed

19

如果您正在使用kotlin类来实现数据库,则使用

apply plugin: 'kotlin-kapt'

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

在您的gradle文件中,它将起作用。


这适用于Android Studio 3.5(但是当前的会议室编译器版本为2.1.0)
Yennefer '19

我认为大多数人在整个项目中都没有使用androidx库...这就是为什么我建议1.1.1 ...我自己面临编译问题,并且使用较旧版本进行的更改很少,因此很安全。
navalkishoreb

11

这不仅仅是更新您的依赖关系。确保您所有的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"

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


11

对于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"

不同的答案!
Pedro Massango

为什么这是不同的家伙?
Patrick Prakash

7

我遇到了这个问题,因为我忘记了适当的依赖

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"

添加注解处理器并重建后,问题解决了。


7

我遇到了问题,因为我忘记了@Dao注释

@Dao
public interface SearchHistoryDao {
    @Query("SELECT * FROM search_history")
    List<SearchHistory> getAll();

    @Insert
    void insertAll(SearchHistory... histories);

    @Delete()
    void delete(SearchHistory history);
}

会议室官方教程


我也忘记了 谢谢:)但仍然崩溃:(
coinhndp

1
通过添加kapt进行修复
coinhndp

7

确保在build.gradle中为房间添加正确的依赖关系

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'

5

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

对于Kotlin,请使用kapt代替注解处理器

所以,代替

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

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

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

4

有同样的问题。按照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


1
从终端运行./gradlew clean build是关键。对我来说,我收到以下消息:app:'annotationProcessor'依赖项不会被识别为kapt注释处理器。请针对以下工件将配置名称更改为“ kapt”:“ android.arch.lifecycle:compiler:1.1.1”,然后应用kapt插件:“ apply plugin:'kotlin-kapt'”。
兰迪

是的,过去在终端执行任务也对我有很大帮助。IDE中的生成工具消息通常“隐藏”原始错误消息
Hajo

3

使用以下gradle链接:

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

您需要创建diffretn singloton类,并从那里获取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
}

我没有创建构造函数,而是通过静态实例直接使用。
Pratik deshai '17

我为房间数据库创建了一个示例项目,您可以在这里检查它:github.com/burhanrashid52/Android-Room-Data-Persistent
Burhanuddin Rashid

2
是的,我已更新,但仍然存在相同的错误,AppDatabase_Impl不存在
Pratik deshai

@pratikdeshai:您是否已解决该错误?我也遇到同样的错误,因此被卡住了。
Jayesh

2

就我而言,我正在测试会议室数据库的连接性,并将测试类放入了在AndroidTest文件夹中创建的目录中。我已将其移出自定义目录,然后效果很好。


这也是我的问题。知道为什么会发生这种情况以及如何避免这种情况吗?我宁愿不要TestDatabase在发行代码中加入。
Eduardo

2

我也发生了同样的现象。

以下

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

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

就我而言,SQL实现中存在错误。修复后,构建成功。

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


1

问题更多是与未在gradle构建中包含的正确库有关。我有一个类似的问题,并添加了缺少的内容

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



0

对我来说,一旦包含与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,您应该一切顺利。


0

在这里阅读示例: 房间示例

我仅使用正确的(我猜是)annotationProcessorFile修复了此错误,如下所示:

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

另外,我将Room版本和Lifecycle版本都升级到2.2.0。

一旦同步了Gradle,我就可以开始使用Room。

所以,祝你好运!让代码与您同在!


0

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

apply plugin: 'kotlin-kapt'

依赖项部分中的以下行:

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

希望它能解决您的问题。


0

不要在OP的情况下,但是这也发生在你错误地使用实现的,而不是annotationProcessor是这样的:

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

代替这个:

annotationProcessor "android.arch.persistence.room:compiler:x.x.x"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.