Android room persistent:AppDatabase_Impl不存在

pra*_*hai 105 java android android-room

我的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Gradle lib:

 compile "android.arch.persistence.room:runtime:+"   
 annotationProcessor "android.arch.persistence.room:compiler:+"
Run Code Online (Sandbox Code Playgroud)

当我要求例如它会给出这个错误时,我的应用程序类中不存在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

    }   

}
Run Code Online (Sandbox Code Playgroud)

RWI*_*WIL 203

对于那些使用Kotlin的人,请尝试更改annotationProcessorkapt应用程序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"
Run Code Online (Sandbox Code Playgroud)

还记得在应用程序级build.gradle文件的顶部添加apply plugin:'kotlin-kapt'并进行清理和重建(根据https://codelabs.developers.google.com/codelabs/android-room-与观点/#6)

在Android Studio中,如果在粘贴代码时或在构建过程中出现错误,请选择"生成">"清理项目".然后选择Build> Rebuild Project,然后再次构建.

  • 还需要在应用程序级别`build.gradle`文件的顶部添加`apply plugin:'kotlin-kapt'` (64认同)
  • 这救了我……我认为谷歌应该更多地努力显示正确的错误……我有 kapt 电话,但我没有添加 apply kapt-plugin (3认同)
  • 现在已更改为“实现“androidx.room:room-ktx:$room_version”” (3认同)
  • 非常感谢。只是搬到Kotlin,我的所有测试用例都开始失败。在敲我的头。然后我不小心看到了这个评论。拯救了我的一天。 (2认同)

Jah*_*bir 76

只是用

apply plugin: 'kotlin-kapt'
Run Code Online (Sandbox Code Playgroud)

在app build.gradle中

并保持两者的依赖关系

annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomVersion"
kapt "android.arch.persistence.room:compiler:$rootProject.roomVersion"
Run Code Online (Sandbox Code Playgroud)

编辑

在较新的版本中,不需要一次添加两个依赖项只需使用,希望它可以工作.

kapt 'android.arch.persistence.room:compiler:1.1.1'
Run Code Online (Sandbox Code Playgroud)


Tha*_*ayi 20

我错过了这个错误

@Database(entity="{<model.class>})
Run Code Online (Sandbox Code Playgroud)

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

@Entity(tableName = "<table_name>" ...)
Run Code Online (Sandbox Code Playgroud)

正确定义,你会很好

  • 为了清楚起见,这位于数据库类定义的正上方。它似乎已经解决了我的问题 - 谢谢! (2认同)

nav*_*reb 16

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

apply plugin: 'kotlin-kapt'
Run Code Online (Sandbox Code Playgroud)

kapt "android.arch.persistence.room:compiler:1.1.1"
Run Code Online (Sandbox Code Playgroud)

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


Aru*_*Das 13

同意以上答案

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

// annotationProcessor "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
Run Code Online (Sandbox Code Playgroud)


Uda*_*ghe 12

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

plugins {
    id "org.jetbrains.kotlin.kapt"
}
Run Code Online (Sandbox Code Playgroud)

也将annotationProcessor其删除并替换为kapt

  • 代替
dependencies {
    def room_version = "2.3.0"
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"
}
Run Code Online (Sandbox Code Playgroud)
  • 使用
dependencies {
    def room_version = "2.3.0"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
}
Run Code Online (Sandbox Code Playgroud)

只能annotationProcessor在java环境下工作。它kapt同时处理 java 和 kotlin。如果您的实现出现问题,这些插件将在编译时显示它们。


Ide*_*dee 10

它不仅仅是更新您的依赖项.确保所有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"
Run Code Online (Sandbox Code Playgroud)

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


Ped*_*ngo 9

对于Kotlin开发人员

用这个:

implementation "android.arch.persistence.room:runtime:1.0.0"
kapt "android.arch.persistence.room:compiler:1.0.0"
Run Code Online (Sandbox Code Playgroud)

并添加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"
Run Code Online (Sandbox Code Playgroud)


she*_*hub 8

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

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

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

    @Delete()
    void delete(SearchHistory history);
}
Run Code Online (Sandbox Code Playgroud)

会议室官方教程


小智 8

确保在 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"
Run Code Online (Sandbox Code Playgroud)

在顶部的线下方 -

apply plugin: 'kotlin-kapt'
Run Code Online (Sandbox Code Playgroud)


小智 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"
Run Code Online (Sandbox Code Playgroud)

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


Haj*_*ajo 6

有同样的问题。按照 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
}
Run Code Online (Sandbox Code Playgroud)

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

  • AppDatabase_Impl
  • UserDao_Impl

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


小智 5

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

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

所以,代替

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

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

    kapt "androidx.room:room-compiler:$room_version"
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

38653 次

最近记录:

5 年,9 月 前