Постоянный номер 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, это будет работать.