我的app数据库类

@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

    }   

}

使用下面的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
}

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

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'

到应用程序级别构建的顶部。Gradle文件,并做一个清洁和重建(根据https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6)

在Android Studio中,如果在粘贴代码或构建过程中出现错误,请选择“构建>清洁项目”。然后选择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"

我错过的时候出现了这个错误

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

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

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

是正确定义的,你会很好吗


只使用

apply plugin: 'kotlin-kapt'

在app build。gradle中

保持两者的依赖关系

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

EDIT

在更新的版本中,不需要同时添加两个依赖项 就用吧,希望能管用。

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

在我的例子中,我正在测试房间数据库的连接性,我已经把测试类放在我在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);
}

官方教程


我也有同样的问题。在一个由Android Studio创建的新示例项目中实现了几个类和接口: https://developer.android.com/training/data-storage/room/

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

警告:没有向注释处理器提供模式导出目录,因此我们不能导出模式。你可以提供空间。schemaLocation注释处理器参数或将exportSchema设置为false。

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

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

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

AppDatabase_Impl UserDao_Impl

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


这个问题更多的是关于gradle构建中没有包含的正确的库。我有一个类似的问题,并补充了缺失

testImplementation“android.arch.persistence.room:测试:room_version美元


我也遇到了同样的现象。

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

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

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

因此,您可能希望检查整个房间库的实现,而不是查看崩溃的局部函数。


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

这个问题已经很老了,但我今天无意中发现了这个问题,提供的答案没有一个能帮到我。最后,我通过注意到谷歌文档实际上仍然采用Java而不是Kotlin默认解决了这个问题,实际上他们添加了一个我忽略的注释

对于Kotlin,使用kapt代替annotationProcessor

所以,与其

annotationProcessor“androidx.room: room-compiler: room_version美元”

如果你使用Kotlin开发,你应该使用:

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

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

apply plugin: 'kotlin-kapt'

and

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

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


更改gradle文件中的依赖项并不能帮助我修复错误。我在房间数据库初始化的课堂上错过了这个数据库注释,这导致了这个问题。

@数据库(实体= [UserModel::class],版本= 1)

确保上面注释中指定的实体模型引用特定的模型类


对我来说,只要你包含任何与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()
    }
}

更新构建。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,你应该可以开始了。


阅读下面的例子: 房间里的例子

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

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

此外,我在房间版本升级到2.2.0,就像在生命周期版本一样。

一旦同步了摇篮,我就可以开始使用房间了。

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


在我的kotlin应用程序中,我只是在我的构建顶部添加了以下一行。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 1.4及以上版本,你的kotlin版本有问题。 从这个链接更新房间到最新版本。


2.3.0-alpha03解决了我的问题。


除了思念

annotationProcessor“android.arch.persistence.room:编译器:. x.x.x”

我还错过了在课上添加下面的注释

@Entity(tableName = "mytablename")

为了防止其他人犯和我一样的错误,不要将数据库类称为“database”,否则您将得到相同的错误。


如果你正在使用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"
}

注释处理器只能在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.0或2.4.2版本的房间时,这个问题仍然存在。但是,当我应用它时,2.5.0-alpha01版本工作得很好。

build.gradle:应用程序

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"

检查类上面的注释

@Database(entities = arrayOf(Schedule::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
// ....
}

在我的例子中,仅仅通过将annotationProcessor更改为kapt来依赖于我的房间编译器,就完成了工作。


在2023年1月,我在重构我的代码以使用ServiceLocator类后遇到了类似的问题。

为了解决这个问题,我在更衣室里玩了很多次。它适用于2.5.0-alpha02

Version_room = "2.5.0-alpha02" <——build。gradle(项目)

 //Room
implementation "androidx.room:room-runtime:$version_room"
kapt "androidx.room:room-compiler:$version_room"
// optional - Kotlin Extensions and Coroutines support for Room
implementation "androidx.room:room-ktx:$version_room"
implementation("androidx.room:room-guava:$version_room")

我在Android Eel 2020.1.1上运行以下程序:

Version_kotlin = "1.7.21" Version_android_gradle_plugin = "4.0.1"