Android room persistent:AppDatabase_Impl不存在

时间:2017-10-10 11:29:06

标签: java android android-room

我的应用数据库类

@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

    }   

}

24 个答案:

答案 0 :(得分:149)

对于使用 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>重建项目,然后重新构建。

答案 1 :(得分:61)

只需使用

apply plugin: 'kotlin-kapt'
build 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'

答案 2 :(得分:14)

我错过了这个错误

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

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

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

已正确定义并且你很好

答案 3 :(得分:8)

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

答案 4 :(得分:5)

我遇到了这个问题,因为我已经忘记了相关的依赖

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并重建之后,问题就解决了。

答案 5 :(得分:5)

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

答案 6 :(得分:4)

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

答案 7 :(得分:2)

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

答案 8 :(得分:2)

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

上面提到的所有解决方案均无济于事,Room并未生成根据我的数据库类所必需的_Impl文件。最终在终端中执行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

答案 9 :(得分:2)

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

apply plugin: 'kotlin-kapt'

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

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

答案 10 :(得分:1)

如果您使用的是 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。如果您的实现有问题,这些插件会在编译时显示出来。

答案 11 :(得分:1)

对于Kotlin开发人员


如果您检查了Dao和Entity并也使用了Kapt,并且没有问题,那么如果您使用的是Kotlin 1.4及更高版本,我想您的kotlin版本有问题。 将Room从此link更新到最新版本。


2.3.0-alpha03 解决了我的问题。

答案 12 :(得分:1)

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

apply plugin: 'kotlin-kapt'

以及“依赖项”部分中的以下行:

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

我希望它可以解决您的问题。

答案 13 :(得分:1)

在gradle文件中更改依赖项并不能帮助我修复错误。我在初始化Room数据库的类中错过了此Database注释,这是导致此问题的原因。

  

@Database(实体= [UserModel :: class],版本= 1)

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

答案 14 :(得分:1)

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

答案 15 :(得分:1)

我也遇到了同样的现象。

关注

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

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

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

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

答案 16 :(得分:1)

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

答案 17 :(得分:0)

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

  

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

所以,而不是

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

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

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

答案 18 :(得分: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,您应该会很好。

答案 19 :(得分:0)

在这里阅读示例: Room Example

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

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

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

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

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

答案 20 :(得分:0)

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

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

代替此:

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

答案 21 :(得分:0)

问题更多的是没有在gradle构建中包含的正确库。我遇到了类似的问题,并添加了缺少的

  

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

答案 22 :(得分:0)

除了失踪

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

我也错过了在我的班级中添加以下注释

@Entity(tableName = "mytablename")

答案 23 :(得分:0)

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