Android 房间持久:AppDatabase_Impl 不存在

Android room persistent: AppDatabase_Impl does not exist

我的应用数据库class

@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 不存在 在我的申请中 class

public class APp extends Application {

    private boolean appRunning = false;

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

    }   

}

使用以下 gradle link:

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

您需要创建一个不同的单例 class 并像这样从那里获取 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
}

遇到这个问题是因为忘记了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后,重新构建,问题解决

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

对于那些使用 Kotlin 的人,请尝试在应用 build.gradle

中将 annotationProcessor 更改为 kapt

例如:

// 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

In Android Studio, if you get errors when you paste code or during the build process, select Build >Clean Project. Then select Build > Rebuild Project, and then build again.


更新

如果你已经迁移到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"

我错过时出现了这个错误

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

确保上面注释中指定的实体模型指的是特定模型class,还要确保必要的注释:

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

定义正确,你会很好

只需使用

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'

在我的例子中,我正在测试房间数据库的连接性,我已将测试 class 放在我在 AndroidTest 文件夹中创建的目录中。我已经把它移出了自定义目录,然后它运行得很好。

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

我遇到了问题,因为我忘记了@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

有同样的问题。实现了少数 classes 和界面,如 Android Studio 创建的新示例项目中官方所述: https://developer.android.com/training/data-storage/room/

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

"warning: Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide room.schemaLocation annotation processor argument OR set exportSchema to false."

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

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

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

  • AppDatabase_Impl
  • UserDao_Impl

我不理解这种行为,因为据说该参数是可选的,请参阅

问题更多地与 gradle 构建中未包含的正确库有关。我遇到了类似的问题并添加了缺失的

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

我也遇到了同样的现象

正在关注

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

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

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

所以你可能想检查整个房间库的实现,而不是查看崩溃的本地文件。

确保在 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'

这个问题很老了,但我今天偶然发现了这个问题,none 提供的答案对我有所帮助。最后我设法通过注意到 google documentation 实际上仍然被 Java 采用而不是默认情况下的 Kotlin 来解决它,实际上他们添加了一条我忽略的评论

For Kotlin use kapt instead of annotationProcessor

所以,而不是

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

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

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

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

apply plugin: 'kotlin-kapt'

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

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

更改我的 gradle 文件中的依赖关系并没有帮助我修复 error.I 在 class 中错过了这个数据库注释,其中初始化了 Room 数据库,这导致了这个问题.

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

确保上面注释中指定的实体模型指的是特定模型class

对我来说,Android Studio 会在您包含任何与 Room 数据库相关的导入时立即自动更新依赖项。但是根据 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,您应该可以开始了。

阅读此处示例: Room Example

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

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

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

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

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

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

apply plugin: 'kotlin-kapt'

依赖项部分中的以下行:

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

希望它能解决您的问题。

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

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

而不是这个:

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

对于 Kotlin 开发人员


如果你检查了Dao和Entity,也使用了Kapt,没有问题,我猜你的kotlin版本有问题,如果你使用的是kotlin 1.4及以上版本。 将 Room 更新到 link.

的最新版本

2.3.0-alpha03 解决了我的问题。

除了失踪

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

我还错过了在 class

中添加以下注释
@Entity(tableName = "mytablename")

为了防止有人犯和我一样的错误,请不要将您的数据库 class 称为“数据库”,否则您会遇到同样的错误。

如果您正在使用 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。如果您的实现有问题,这些插件将在编译时显示它们。

同意以上回答

解决方法如下。将 annotationProcessor 更改为 kapt,如下所示

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

上面的答案没有任何效果,我注意到当我使用房间版本2.3.02.4.2 时问题仍然存在。但是,2.5.0-alpha01 版本在我应用时效果很好。

build.gradle:app

def roomVersion = '2.5.0-alpha01'
implementation "androidx.room:room-ktx:$roomVersion"
kapt "androidx.room:room-compiler:$roomVersion"
testImplementation "android.arch.persistence.room:testing:$roomVersion"