Постійний номер для Android: AppDatabase_Impl не існує


148

Мій клас баз даних додатків

@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

    }   

}

Чи можете ви надати належну помилку logcat, яку ви отримуєте?
Дебанджан

1
Викликано: java.lang.RuntimeException: не вдається знайти реалізацію для AppDatabase. AppDatabase_Impl не існує
pratik deshai

Ви вказали розташування схеми кімнати в градле?
Дебанджан

1
@pratikdeshai Чи отримали ви вирішення цього питання? У мене теж є та ж проблема.
Крунал

У моєму випадку я видалив плагін kotlin, щоб виправити його. застосовувати плагін: 'Котлін-kapt'
Наполеон

Відповіді:


304

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


ОНОВЛЕННЯ

Якщо ви перейшли на андроїд

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
Дуже дякую. Тільки переїхав до Котліна, і всі мої тестові справи почали провалюватися. Бив головою. Тоді я випадково побачив цей коментар. Врятував мій день.
Ozeetee

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

1
Це врятувало мене .... Я думаю, що Google повинен більше працювати над тим, щоб показувати належну помилку ... У мене був виклик kapt, але я не додав застосувати kapt-плагін
anoop4real

Застрягла з вчорашнього дня. дуже дякую. Я не розумію, чому люди в Google не згадують про це в документації.
Shubham Anand

Ти КОЗА врятував мене тим швидким виправданням
Fanadez

82

Просто використовуйте

apply plugin: 'kotlin-kapt'

у програмі 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'

22

У мене була ця помилка, коли я сумував

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

Переконайтесь, що модель сутності, зазначена в примітці вище, стосується конкретного класу моделі, а також переконайтесь, що необхідна примітка:

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

правильно визначено, і ви будете гарні


1
Для наочності це безпосередньо над визначенням класу DB. Здається, виправили мою проблему - дякую!
winwaed

19

якщо ви використовуєте класи kotlin для реалізації бази даних, тоді використовуйте

apply plugin: 'kotlin-kapt'

і

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

у вашому файлі gradle він буде працювати.


Це працює на Android Studio 3.5 (однак поточна версія компілятора номерів - 2.1.0)
Yennefer

Я думаю, що більшість людей не використовували бібліотеку 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"

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


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'

5

Питання досить старе, але я сьогодні натрапив на це, і жодна із наданих відповідей мені не допомогла. Нарешті мені вдалося вирішити це, помітивши, що документація google насправді все ще прийнята для Java, а не Котлін за замовчуванням, насправді вони додали коментар, який я проігнорував

Для Kotlin використовуйте kapt замість annotationProcessor

Отже, замість

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

Якщо ви розробляєте компанію Kotlin, вам слід скористатися:

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

4

Була така ж проблема. Реалізовано кілька класів та інтерфейс, як офіційно було сказано в новому прикладі проекту, створеного 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
}

А потім це спрацювало, знайшов ці два згенеровані файли в модулі додатка в режимі generatedJava:

  • AppDatabase_Impl
  • UserDao_Impl

Я не розумію цю поведінку, оскільки параметр, як кажуть, є необов'язковим, див. Https://stackoverflow.com/a/44645943/3258117


1
Ключовим був запуск ./gradlew чистої збірки з терміналу. Для мене я отримав це повідомлення: app: "annotationProcessor" залежності не буде визнано процесорами анотації kapt. Будь ласка, змініть ім’я конфігурації на 'kapt' для цих артефактів: 'android.arch.lifecycle: компілятор: 1.1.1' та застосуйте плагін kapt: "застосувати плагін: 'kotlin-kapt'".
Ренді

Ага так, виконання завдань у терміналі також мені дуже допомогло в минулому. Повідомлення інструментів збирання в IDE часто "приховують" оригінальне повідомлення про помилку
Hajo

3

Використовуйте наступне посилання gradle:

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

Вам потрібно створити різний клас синглотона та отримати базу даних Appdata таким чином:

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

Я створив зразковий
Rashid

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 не допомогла мені виправити помилку. Я пропустив цю анотацію бази даних у класі, де було ініціалізовано базу даних кімнати, що спричинило цю проблему.

@Database (сутності = [UserModel :: клас], версія = 1)

Переконайтесь, що модель сутності, зазначена в примітці вище, стосується конкретного класу моделі


це те, що я пропустив
pjwin

0

Для мене Android Studio автоматично оновлював залежності, як тільки ви включаєте будь-який імпорт бази даних Room. Але відповідно до https://developer.android.com/jetpack/androidx/releases/room#declaring_dependitions вам потрібно кілька оновити. Ось як виглядає моя база коду:

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.

Після синхронізації грейдера я могла почати працювати з Кімнатою.

Отже, удачі! І нехай код буде з вами!


0

У своєму додатку kotlin я щойно додав наступний рядок у верхній частині мого файлу build.gradle:

apply plugin: 'kotlin-kapt'

І наступний рядок у розділі залежностей:

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

Сподіваюся, це вирішить вашу проблему.


0

Не у випадку з ОП, але це також відбувається, коли ви помилково використовуєте реалізацію замість 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.