Постоянный номер Android: AppDatabase_Impl не существует

Мой класс базы данных приложения

@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

    }   

}

Ответ 1

Для тех, кто работает с 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"

также не забудьте добавить плагин приложения: "kotlin-kapt" в начало файла build.gradle на уровне приложения и выполнить чистую и перестроенную (согласно https://codelabs.developers.google.com/codelabs/android-room- with-a-view/# 6)

В Android Studio, если вы получаете ошибки при вставке кода или во время процесса сборки, выберите "Сборка"> "Очистить проект". Затем выберите Build> Rebuild Project, а затем снова создайте.

Ответ 2

Просто используйте

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'

Ответ 3

У меня была эта ошибка, когда я пропустил

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

Убедитесь, что модель объекта, указанная в аннотации выше, относится к конкретному классу модели, а также обеспечивает необходимую аннотацию:

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

правильно определено, и вы были бы хороши

Ответ 4

Это не просто обновление ваших зависимостей. Убедитесь, что все ваши зависимости в комнате одинаковы.

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"

В приведенном выше фрагменте примера все мои зависимости в комнате имеют ту же версию 1.1.0-alpha2

Ответ 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

Я встретил эту проблему, потому что забыл 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"

после добавления аннотациипроцессора и восстановления его, проблема решена.

Ответ 7

Я @Dao с проблемой, потому что я забыл аннотацию @Dao

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

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

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

Room Официальный учебник

Ответ 8

Используйте следующую ссылку градиента:

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

Вам нужно создать класс difflotn singloton и получить Appdatabase от ther следующим образом:

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
}

Ответ 9

Была такая же проблема. Реализовано несколько классов и интерфейс, как официально сказано в новом примере проекта, созданного Android Studio: https://developer.android.com/training/data-storage/room/

Все упомянутые выше решения не помогли, необходимые _Impl файлы в соответствии с моим классом базы данных не были сгенерированы Room. Наконец, выполнение gradle clean build в терминале дало мне подсказку, которая привела к решению:

"предупреждение: каталог экспорта схемы не предоставляется процессору аннотаций, поэтому мы не можем экспортировать схему. Вы можете либо предоставить room.schemaLocation процессора аннотации room.schemaLocation либо установить для exportSchema значение false".

Я добавил параметр exportSchema = false в класс базы данных

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

И тогда это сработало, обнаружил эти два сгенерированных файла в модуле приложения под generateJava:

  • AppDatabase_Impl
  • UserDao_Impl

Я не понимаю этого поведения, так как параметр, как говорят, является необязательным, см. fooobar.com/questions/152627/...

Ответ 10

В моем случае я тестировал подключение к базе данных в комнате, и я поместил класс тестирования в каталог, который я создал в папке AndroidTest. Я переместил его из пользовательского каталога, но он работал очень хорошо.

Ответ 11

Такое же явление произошло со мной.

следующий

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

Добавление вызывает еще одну ошибку сборки, но отслеживает причину из журнала.

В моем случае произошла ошибка в реализации SQL. После исправления сборка прошла успешно.

Поэтому вы можете проверить реализацию всей библиотеки комнат, а не смотреть на разбившихся локальных жителей.

Ответ 12

убедитесь, что добавили правильную зависимость для комнаты в 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"

И ниже линии на top-

apply plugin: 'kotlin-kapt'

Ответ 13

Проблема больше связана с правильной библиотекой, которая не включена в сборку Gradle. У меня была похожая проблема и я добавил недостающее

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

Ответ 14

Вопрос довольно старый, но я наткнулся на это сегодня, и ни один из предоставленных ответов не помог мне. Наконец, мне удалось решить эту проблему, заметив, что документация Google на самом деле все еще принята на Java, а не на Kotlin по умолчанию, фактически они добавили комментарий, который я проигнорировал

Для Kotlin используйте kapt вместо annotationProcessor

Итак, вместо

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

Если вы разрабатываете с Kotlin, вы должны использовать:

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

Ответ 15

если вы используете классы kotlin для реализации базы данных, используйте

apply plugin: 'kotlin-kapt'

а также

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

в вашем файле Gradle, это будет работать.