Постоянная комната Android: AppDatabase_Impl не существует


157

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

@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

    }   

}

Можете ли вы предоставить правильную ошибку logcat, которую вы получаете?
Debanjan

1
Вызвано: java.lang.RuntimeException: не удается найти реализацию для AppDatabase. AppDatabase_Impl не существует
Pratik Deshai

Вы указали расположение схемы комнаты в Gradle?
Debanjan

1
@pratikdeshai Получили ли вы решение этой проблемы? У меня такая же проблема.
Krunal 03

В моем случае я удалил плагин kotlin, чтобы исправить это. применить плагин: 'kotlin-kapt'
Napolean

Ответы:


321

Для тех , кто работает с Котлин , попробуйте изменить , 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, если вы получаете ошибки при вставке кода или в процессе сборки, выберите Сборка> Очистить проект. Затем выберите «Сборка»> «Перестроить проект» и повторите сборку.


ОБНОВИТЬ

Если вы перешли на androidx

def room_version = "2.2.3" // check latest version from docs

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

2
Большое спасибо. Просто перешел на Kotlin, и все мои тестовые примеры начали давать сбой. Бился головой. Потом случайно увидел этот комментарий. Спас мой день.
Ozeetee

79
Также нужно добавить apply plugin: 'kotlin-kapt'в начало build.gradleфайла уровня приложения
daka 06

1
Это спасло меня .... Я думаю, что Google должен больше работать над отображением правильной ошибки ... У меня был вызов kapt, но я не добавил применить kapt-plugin
anoop4real

Застрял со вчерашнего дня. большое спасибо. Я не понимаю, почему люди Google не упоминают об этом в документации.
Шубхам Ананд

Ты КОЗА спас меня этим быстрым исправлением Gradle
Тонни

82

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

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'

23

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

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

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

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

правильно определено, и все будет хорошо


1
Для ясности это идет непосредственно над определением класса DB. Кажется, моя проблема решена - спасибо!
winwaed 02

19

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

apply plugin: 'kotlin-kapt'

а также

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

в вашем файле gradle он будет работать.


Это работает на Android Studio 3.5 (однако текущая версия компилятора комнаты - 2.1.0)
Йеннифер,

Я думаю, что большинство людей не использовали библиотеку androidx во всем проекте ... поэтому я предложил 1.1.1 ... Я сам столкнулся с проблемами компиляции и чувствовал себя в безопасности с минимальными изменениями, используя старую версию.
navalkishoreb

11

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

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


11

Для разработчиков 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"

Разные ответы!
Педро Массанго

Почему это другой чувак?
Патрик Пракаш

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"

после добавления annotationProcessor и его перестройки проблема решена.


7

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

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

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

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

Официальное руководство по комнате


Я тоже забыл об этом. Спасибо :) Но все равно вылет :(
coinhndp

1
Исправить добавлением kapt
coinhndp

7

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

6

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

Все упомянутые выше решения не помогли, необходимые файлы _Impl в соответствии с моим классом базы данных не были созданы Room. Наконец, выполнение 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
}

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

  • AppDatabase_Impl
  • UserDao_Impl

Я не понимаю этого поведения, поскольку параметр считается необязательным, см. Https://stackoverflow.com/a/44645943/3258117


1
Ключевым моментом было выполнение чистой сборки ./gradlew из терминала. Для меня я получил это сообщение: зависимости app: 'annotationProcessor' не будут распознаваться как обработчики аннотаций kapt. Измените имя конфигурации на 'kapt' для этих артефактов: 'android.arch.lifecycle: compiler: 1.1.1' и примените плагин kapt: "apply plugin: 'kotlin-kapt'".
Рэнди

Ах да, в прошлом мне тоже очень помогало выполнение задач в терминале. Сообщения инструментов сборки в среде IDE часто «скрывают» исходное сообщение об ошибке
Hajo

5

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

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

Итак, вместо

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

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

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

3

Используйте следующую ссылку gradle:

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

Вам нужно создать синглотонный класс diffretn и получить оттуда базу данных следующим образом:

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
}

Я не создавал конструктор, я использую напрямую через статический экземпляр.
Pratik Deshai

Я создал образец проекта для базы данных номеров, вы можете проверить его здесь: github.com/burhanrashid52/Android-Room-Data-Persistent
Бурхануддин Рашид

2
да, я обновился, но с той же ошибкой, AppDatabase_Impl не существует
pratik deshai

@pratikdeshai: Вы исправили эту ошибку ?? Я тоже получаю ту же ошибку, застрял из-за этого.
Jayesh

2

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


Это тоже моя проблема. Есть идеи, почему это происходит и как этого избежать? Я бы предпочел не включать TestDatabaseв код выпуска.
Эдуардо

2

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

следующий

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

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

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

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


1

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

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


1

Изменение зависимостей в моем файле gradle не помогло мне исправить ошибку. Я пропустил эту аннотацию к базе данных в классе, где была инициализирована база данных Room, что вызывало эту проблему.

@Database (entity = [UserModel :: class], версия = 1)

Убедитесь, что модель сущности, указанная в аннотации выше, относится к конкретному классу модели.


это то, что я пропустил
pjwin

1

В моем приложении kotlin я просто добавил следующую строку вверху файла build.gradle:

apply plugin: 'kotlin-kapt'

И следующая строка в разделе зависимостей:

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

Надеюсь, это решит вашу проблему.


0

Для меня 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"

}

Синхронизируйте градиент, и все будет в порядке.


0

Чтение примера здесь: Пример помещения

Я исправил эту ошибку, просто используя правильный (я думаю, это) файл annotationProcessorFile, как показано ниже:

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

Кроме того, я обновился до 2.2.0 как в версии для комнаты, так и в версии Lifecycle.

После синхронизации градиента я мог начать работать с Room.

Удачи! И пусть код будет с вами!


0

Не в случае OP, но это также происходит, когда вы по ошибке используете реализацию вместо annotationProcessor, например:

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

Вместо этого:

annotationProcessor "android.arch.persistence.room:compiler:x.x.x"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.