Trwały pokój z systemem Android: AppDatabase_Impl nie istnieje


148

Moja klasa bazy danych aplikacji

@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:+"

A kiedy zapytam na przykład, poda ten błąd, AppDatabase_Impl nie istnieje w mojej klasie aplikacji

public class APp extends Application {

    private boolean appRunning = false;

    @Override
    public void onCreate() {
        super.onCreate();
        AppDatabase.getAppDatabase(this); //--AppDatabase_Impl does not exist

    }   

}

Czy możesz podać prawidłowy błąd logcat, który otrzymujesz?
Debanjan

1
Przyczyna: java.lang.RuntimeException: nie można znaleźć implementacji dla AppDatabase. AppDatabase_Impl nie istnieje
pratik deshai

Czy podałeś lokalizację schematu pokoju w gradle?
Debanjan

1
@pratikdeshai Czy udało Ci się znaleźć rozwiązanie tego problemu? Ja też mam ten sam problem.
Krunal,

W moim przypadku usunąłem wtyczkę kotlin, aby to naprawić. zastosuj wtyczkę: „kotlin-kapt”
Napolean

Odpowiedzi:


304

Dla osób pracujących z Kotlin , spróbuj zmienić annotationProcessorsię kaptw aplikacjachbuild.gradle

na przykład:

// 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"

pamiętaj również o dodaniu tej wtyczki

apply plugin: 'kotlin-kapt'

na górę pliku build.gradle na poziomie aplikacji i wyczyść go i przebuduj (zgodnie z https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6 )

Jeśli w Android Studio wystąpią błędy podczas wklejania kodu lub podczas procesu kompilacji, wybierz opcję Kompiluj> Wyczyść projekt. Następnie wybierz opcję Kompiluj> Odbuduj projekt, a następnie skompiluj ponownie.


AKTUALIZACJA

Jeśli przeprowadziłeś migrację do 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
Wielkie dzięki. Po prostu przeprowadziłem się do Kotlina i wszystkie moje przypadki testowe zaczęły zawodzić. Walił mnie w głowę. Wtedy przypadkowo zobaczyłem ten komentarz. Uratowałem mój dzień.
Ozeetee

77
Należy również dodać plik apply plugin: 'kotlin-kapt'na początku poziomu aplikacjibuild.gradle
daka

1
To mnie uratowało ... Myślę, że Google powinno bardziej popracować nad wyświetlaniem właściwego błędu ... Miałem wywołanie kapt, ale nie dodałem zastosuj wtyczki
kapt

Utknął od wczoraj. wielkie dzięki. Nie rozumiem, dlaczego ludzie w Google nie wspominają o tym w dokumentacji.
Shubham Anand

You're the GOAT uratował mnie dzięki tej szybkiej poprawce gradle
Fanadez

82

Po prostu użyj

apply plugin: 'kotlin-kapt'

w aplikacji build.gradle

I trzymaj oba w zależnościach

annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomVersion"
kapt "android.arch.persistence.room:compiler:$rootProject.roomVersion"

EDYTOWAĆ

W nowszej wersji nie trzeba dodawać obu zależności na raz. Po prostu użyj, miej nadzieję, że zadziała.

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

22

Miałem ten błąd, kiedy chybiłem

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

Upewnij się, że model jednostki określony w powyższej adnotacji odnosi się do konkretnej klasy modelu, a także upewnij się, że niezbędna adnotacja:

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

jest odpowiednio zdefiniowany i byłbyś dobry


1
Dla jasności, jest to bezpośrednio powyżej definicji klasy DB. Wygląda na to, że rozwiązał mój problem - dzięki!
winwaed

19

jeśli używasz klas kotlin do implementacji bazy danych, użyj

apply plugin: 'kotlin-kapt'

i

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

w twoim pliku ocen, to zadziała.


Działa to na Android Studio 3.5 (jednak obecna wersja kompilatora pokojów to 2.1.0)
Yennefer

Myślę, że większość ludzi nie korzystała z biblioteki androidx w całym projekcie ... dlatego zasugerowałem 1.1.1 ... Sam miałem problemy z kompilacją i czułem się bezpiecznie przy minimalnych zmianach na starszej wersji.
navalkishoreb

11

Nie chodzi tylko o aktualizację zależności. Upewnij się, że wszystkie zależności Room mają tę samą wersję.

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"

W powyższym przykładowym fragmencie wszystkie moje zależności Room mają tę samą wersję 1.1.0-alpha2


11

Dla programistów Kotlin

Użyj tego:

implementation "android.arch.persistence.room:runtime:1.0.0"
kapt "android.arch.persistence.room:compiler:1.0.0"

I dodaj apply plugin: 'kotlin-kapt'na górę poziomu aplikacji build.gradle.

Dla programistów Java

implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"

Różne odpowiedzi!
Pedro Massango

Dlaczego to jest inny koleś?
Patrick Prakash

7

Spotkałem się z tym problemem, ponieważ zapomniałem o trafnych zależnościach

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"

po dodaniu annotationProcessor i przebudowie go problem został rozwiązany.


7

Spotykam się z problemem, bo zapominam o @Daoadnotacji

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

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

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

Oficjalny samouczek dotyczący pokoju


Ja też o tym zapomniałem. Dziękuję :) Ale nadal crashh :(
coinhndp

1
Napraw, dodając kapt
coinhndp

7

upewnij się, że dodano poprawną zależność dla pokoju w pliku 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"

A poniżej linii u góry

apply plugin: 'kotlin-kapt'

5

Pytanie jest dość stare, ale natknąłem się na to dzisiaj i żadna z udzielonych odpowiedzi mi nie pomogła. W końcu udało mi się to rozwiązać, zauważając, że dokumentacja google faktycznie jest nadal adoptowana do Javy, a nie domyślnie Kotlina, w rzeczywistości dodali komentarz, który zignorowałem

W przypadku Kotlina użyj kapt zamiast annotationProcessor

Więc zamiast

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

Jeśli rozwijasz się z Kotlinem, powinieneś użyć:

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

4

Miałem ten sam problem. Zaimplementowałem kilka klas i interfejs, jak oficjalnie powiedziano w nowym przykładowym projekcie stworzonym przez Android Studio: https://developer.android.com/training/data-storage/room/

Wszystkie powyższe rozwiązania nie pomogły, potrzebne pliki _Impl zgodnie z moją klasą bazy danych nie zostały wygenerowane przez Room. Wreszcie wykonanie kompilacji gradle clean w terminalu dało mi wskazówkę prowadzącą do rozwiązania:

„ostrzeżenie: katalog eksportu schematu nie jest dostarczany do procesora adnotacji, więc nie możemy wyeksportować schematu. Możesz albo podać room.schemaLocationargument procesora adnotacji LUB ustawić exportSchema na false.”

Dodałem parametr exportSchema = false w klasie bazy danych

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

A potem zadziałało, znalazłem te dwa wygenerowane pliki w module aplikacji w obszarze generatedJava:

  • AppDatabase_Impl
  • User replace_Impl

Nie rozumiem tego zachowania, ponieważ mówi się, że parametr jest opcjonalny, patrz https://stackoverflow.com/a/44645943/3258117


1
Kluczem było uruchomienie ./gradlew czystej kompilacji z terminala. Otrzymałem następujący komunikat: app: Zależności 'annotationProcessor' nie zostaną rozpoznane jako procesory adnotacji kapt. Zmień nazwę konfiguracji na „kapt” dla tych artefaktów: „android.arch.lifecycle: compiler: 1.1.1” i zastosuj wtyczkę kapt: „apply plugin: 'kotlin-kapt'".
Randy,

Ach tak, wykonywanie zadań w terminalu również bardzo mi pomogło w przeszłości. Komunikaty narzędzi kompilacji w środowisku IDE często „ukrywają” oryginalny komunikat o błędzie
Hajo

3

Użyj następującego linku do gradle:

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

Musisz stworzyć diffretn singloton class i pobrać bazę danych aplikacji od takich osób:

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
}

nie stworzyłem konstruktora, używam bezpośrednio przez instancję statyczną.
pratik deshai

Stworzyłem przykładowy projekt dla bazy danych pokoi, możesz go sprawdzić tutaj: github.com/burhanrashid52/Android-Room-Data-Persistent
Burhanuddin Rashid

2
tak, zaktualizowałem, ale nadal ten sam błąd, AppDatabase_Impl nie istnieje
pratik deshai

@pratikdeshai: Czy naprawiłeś ten błąd? Otrzymuję również ten sam błąd, utknąłem z tego powodu.
Jayesh,

2

W moim przypadku testowałem łączność z bazą danych pokoi i umieściłem klasę testującą w katalogu, który utworzyłem, w folderze AndroidTest. Przeniosłem go z katalogu niestandardowego, a potem działał całkiem dobrze.


To też jest mój problem. Masz pojęcie, dlaczego tak się dzieje i jak tego uniknąć? Wolałbym raczej nie mieć TestDatabasew kodzie wydania.
Eduardo

2

Przyszło mi do głowy to samo zjawisko.

następujący

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

Dodanie powoduje kolejny błąd kompilacji, ale śledzi przyczynę w dzienniku.

W moim przypadku wystąpił błąd w implementacji SQL. Po naprawieniu kompilacja przebiegła pomyślnie.

Możesz więc chcieć sprawdzić implementację całej biblioteki pokoju, zamiast patrzeć na rozbitych mieszkańców.


1

Problem jest bardziej związany z poprawną biblioteką, która nie jest zawarta w kompilacji Gradle. Miałem podobny problem i dodałem brakujący

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


1

Zmiana zależności w moim pliku gradle nie pomogła mi w naprawieniu błędu. Przegapiłem tę adnotację bazy danych w klasie, w której zainicjowano bazę danych pokoju, co było przyczyną tego problemu.

@Database (entity = [UserModel :: class], wersja = 1)

Upewnij się, że model jednostki określony w powyższej adnotacji odnosi się do określonej klasy modelu


to właśnie przegapiłem
pjwin

0

Dla mnie Android Studio automatycznie aktualizuje zależności, gdy tylko dołączysz dowolny import związany z bazą danych Room. Ale zgodnie z https://developer.android.com/jetpack/androidx/releases/room#declaring_dependencies , musisz zaktualizować kilka. Oto jak wygląda moja baza kodu:

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()
    }
}

Zaktualizuj plik build.gradle zgodnie z jedną z odpowiedzi:

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"

}

Zsynchronizuj gradle i powinieneś być gotowy.


0

Czytając przykład tutaj: Przykład pokoju

Naprawiłem ten błąd, używając poprawnej (chyba tak) adnotacjiProcessorFile, w następujący sposób:

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

Ponadto zaktualizowałem do 2.2.0 zarówno w wersji Room, jak w wersji Lifecycle.

Po zsynchronizowaniu graddle mogłem rozpocząć pracę z Room.

Więc powodzenia! I niech kod będzie z tobą!


0

W mojej aplikacji kotlin właśnie dodałem następujący wiersz na górze mojego pliku build.gradle:

apply plugin: 'kotlin-kapt'

I następujący wiersz w sekcji zależności:

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

Mam nadzieję, że to rozwiąże Twój problem.


0

Nie w przypadku OP, ale dzieje się tak również wtedy, gdy omyłkowo użyjesz implementacji zamiast procesora adnotacji w ten sposób:

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

Zamiast tego:

annotationProcessor "android.arch.persistence.room:compiler:x.x.x"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.