Android-Raum persistent: AppDatabase_Impl existiert nicht

147

Meine App-Datenbankklasse

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

Und wenn ich zum Beispiel frage, wird es diesen Fehler geben, AppDatabase_Impl existiert nicht in meiner Anwendungsklasse

public class APp extends Application {

    private boolean appRunning = false;

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

    }   

}
pratik deshai
quelle
Können Sie den richtigen Logcat-Fehler angeben, den Sie erhalten?
Debanjan
1
Auslöser: java.lang.RuntimeException: Implementierung für AppDatabase kann nicht gefunden werden. AppDatabase_Impl existiert nicht
pratik deshai
Haben Sie den Speicherort des Raumschemas in Gradle angegeben?
Debanjan
1
@pratikdeshai Hast du eine Lösung für dieses Problem bekommen? Ich habe auch das gleiche Problem.
Krunal
In meinem Fall habe ich das Kotlin-Plugin entfernt, um es zu reparieren. Plugin anwenden: 'kotlin-kapt'
Napolean

Antworten:

303

Für diejenigen , die arbeiten Kotlin , versuchen zu ändern , annotationProcessorum kaptin den Appsbuild.gradle

beispielsweise:

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

Denken Sie auch daran, dieses Plugin hinzuzufügen

apply plugin: 'kotlin-kapt'

Gehen Sie zum Anfang der build.gradle-Datei auf App-Ebene und führen Sie eine Bereinigung und Neuerstellung durch (gemäß https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6 ).

Wenn in Android Studio beim Einfügen von Code oder während des Erstellungsprozesses Fehler auftreten, wählen Sie Erstellen> Projekt bereinigen. Wählen Sie dann "Erstellen"> "Projekt neu erstellen" und erstellen Sie es erneut.


AKTUALISIEREN

Wenn Sie zu AndroidX migriert sind

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"
RWIL
quelle
2
Vielen Dank. Ich bin gerade nach Kotlin gezogen und alle meine Testfälle sind fehlgeschlagen. Schlug meinen Kopf. Dann habe ich diesen Kommentar versehentlich gesehen. Hat meinen Tag gerettet.
Ozeetee
77
Müssen auch hinzufügen , apply plugin: 'kotlin-kapt'um die Spitze der App - Ebene build.gradleDatei
Daka
1
Das hat mich gerettet ... Ich denke, Google sollte mehr daran arbeiten, den richtigen Fehler anzuzeigen ... Ich hatte einen Kapt-Aufruf, aber ich habe kein Apply-Kapt-Plugin
hinzugefügt
War seit gestern fest. Vielen Dank. Ich verstehe nicht, warum Google-Leute dies nicht in der Dokumentation erwähnen.
Shubham Anand
Du bist die Ziege, die mich mit dieser schnellen Lösung gerettet hat
Fanadez
82

Benutz einfach

apply plugin: 'kotlin-kapt'

in der App build.gradle

Und halten Sie beide in Abhängigkeiten

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

BEARBEITEN

In einer neueren Version müssen nicht beide Abhängigkeiten gleichzeitig hinzugefügt werden. Verwenden Sie einfach, hoffen Sie, dass es funktioniert.

kapt 'android.arch.persistence.room:compiler:1.1.1'
Jahangir Kabir
quelle
22

Ich hatte diesen Fehler, als ich ihn verpasste

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

Stellen Sie sicher, dass sich das in der obigen Anmerkung angegebene Entitätsmodell auf die jeweilige Modellklasse bezieht, und stellen Sie außerdem sicher, dass die erforderliche Anmerkung:

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

ist richtig definiert und du wärst gut

Thadeus Ajayi
quelle
1
Aus Gründen der Übersichtlichkeit geht dies unmittelbar über die Definition der DB-Klasse hinaus. Es scheint mein Problem behoben zu haben - danke!
Winwaed
19

Wenn Sie Kotlin-Klassen zum Implementieren der Datenbank verwenden, verwenden Sie

apply plugin: 'kotlin-kapt'

und

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

In Ihrer Gradle-Datei wird es funktionieren.

navalkishoreb
quelle
Dies funktioniert unter Android Studio 3.5 (die aktuelle Room-Compiler-Version ist jedoch 2.1.0)
Yennefer
Ich denke, die meisten Leute haben die AndroidX-Bibliothek im gesamten Projekt nicht verwendet ... deshalb habe ich 1.1.1 vorgeschlagen ... Ich selbst hatte Probleme mit der Kompilierung und fühlte mich mit minimalen Änderungen bei Verwendung der älteren Version sicher.
Navalkishoreb
11

Es geht nicht nur darum, Ihre Abhängigkeiten zu aktualisieren. Stellen Sie sicher, dass alle Ihre Raumabhängigkeiten dieselbe Version haben.

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"

Im obigen Beispiel-Snippet haben alle meine Room-Abhängigkeiten dieselbe Version 1.1.0-alpha2

Idee
quelle
11

Für Kotlin-Entwickler

Benutze das:

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

Und fügen Sie apply plugin: 'kotlin-kapt'zur Spitze der App-Ebene hinzu build.gradle.

Für Java-Entwickler

implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
Pedro Massango
quelle
Unterschiedliche Antworten!
Pedro Massango
Wie kommt es, dass das anders ist, Alter?
Patrick Prakash
7

Ich bin auf dieses Problem gestoßen, weil ich die passenden Abhängigkeiten vergessen habe

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"

Nachdem Sie den annotationProcessor hinzugefügt und neu erstellt haben, wurde das Problem behoben.

ahsiu
quelle
7

Ich stoße auf das Problem, weil ich @DaoAnmerkungen vergesse

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

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

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

Raum Offizielles Tutorial

Shellhub
quelle
Ich habe es auch vergessen. Vielen Dank :) Aber immer noch Absturz :(
coinhndp
1
Behebung durch Hinzufügen von kapt
coinhndp
7

Stellen Sie sicher, dass Sie die richtige Abhängigkeit für den Raum in build.gradle hinzufügen

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"

Und unter der Zeile oben

apply plugin: 'kotlin-kapt'
Deepak
quelle
5

Die Frage ist ziemlich alt, aber ich bin heute darauf gestoßen, und keine der Antworten hat mir geholfen. Schließlich gelang es mir, das Problem zu beheben, indem ich feststellte, dass die Google- Dokumentation tatsächlich immer noch in Java und nicht standardmäßig in Kotlin übernommen wird. Tatsächlich haben sie einen Kommentar hinzugefügt, den ich ignoriert habe

Verwenden Sie für Kotlin kapt anstelle von annotationProcessor

Also statt

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

Wenn Sie mit Kotlin entwickeln, sollten Sie Folgendes verwenden:

    kapt "androidx.room:room-compiler:$room_version"
Pavel
quelle
4

Hatte das gleiche Problem. Implementierte die wenigen Klassen und Schnittstellen, wie in einem neuen Beispielprojekt von Android Studio offiziell beschrieben: https://developer.android.com/training/data-storage/room/

Alle oben genannten Lösungen haben nicht geholfen, die erforderlichen _Impl-Dateien gemäß meiner Datenbankklasse wurden nicht von Room generiert. Das endgültige Ausführen von gradle clean build in terminal gab mir den Hinweis, der zur Lösung führte:

"Warnung: Das Schemaexportverzeichnis wird dem Anmerkungsprozessor nicht bereitgestellt, daher können wir das Schema nicht exportieren. Sie können entweder das room.schemaLocationArgument des Anmerkungsprozessors angeben oder exportSchema auf false setzen."

Ich habe den Parameter exportSchema = false in der Datenbankklasse hinzugefügt

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

Und dann hat es geklappt, diese beiden generierten Dateien im App-Modul unter generateJava gefunden:

  • AppDatabase_Impl
  • UserDao_Impl

Ich verstehe dieses Verhalten nicht, da der Parameter als optional bezeichnet wird (siehe https://stackoverflow.com/a/44645943/3258117)

Hajo
quelle
1
Das Ausführen von ./gradlew clean build vom Terminal aus war der Schlüssel. Für mich wurde folgende Meldung angezeigt: app: 'annotationProcessor'-Abhängigkeiten werden nicht als kapt-Annotationsprozessoren erkannt. Bitte ändern Sie den Konfigurationsnamen für diese Artefakte in 'kapt': 'android.arch.lifecycle: compiler: 1.1.1' und wenden Sie das kapt-Plugin an: "apply plugin: 'kotlin-kapt'".
Randy
Ach ja, die Ausführung der Aufgaben im Terminal hat mir in der Vergangenheit auch sehr geholfen. Die Build-Tools-Nachrichten in der IDE "verbergen" häufig die ursprüngliche Fehlermeldung
Hajo
3

Verwenden Sie den folgenden Gradle-Link:

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

Sie müssen eine andere Singloton-Klasse erstellen und die Appdatabase wie folgt abrufen:

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
}
Burhanuddin Rashid
quelle
Ich habe keinen Konstruktor erstellt, ich verwende direkt über eine statische Instanz.
Pratik Deshai
Ich habe ein Beispielprojekt für die Raumdatenbank erstellt, das Sie hier überprüfen können: github.com/burhanrashid52/Android-Room-Data-Persistent
Burhanuddin Rashid
2
Ja, ich habe aktualisiert, aber immer noch den gleichen Fehler. AppDatabase_Impl existiert nicht
Pratik Deshai
@pratikdeshai: Hast du diesen Fehler behoben? Ich bekomme auch den gleichen Fehler, stecke deswegen fest.
Jayesh
2

In meinem Fall habe ich die Konnektivität für die Raumdatenbank getestet und die Testklasse in das Verzeichnis gestellt, das ich im AndroidTest-Ordner erstellt habe. Ich habe es aus dem benutzerdefinierten Verzeichnis verschoben, dann hat es ziemlich gut funktioniert.

Farruh Habibullaev
quelle
Das ist auch mein Problem. Irgendeine Idee, warum dies geschieht und wie dies vermieden werden kann? Ich möchte lieber keinen TestDatabaseim Release-Code haben.
Eduardo
2

Das gleiche Phänomen kam mir in den Sinn.

folgenden

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

Das Hinzufügen verursacht einen weiteren Erstellungsfehler, verfolgt jedoch die Ursache aus dem Protokoll.

In meinem Fall ist ein Fehler in der SQL-Implementierung aufgetreten. Nach dem Reparieren war der Build erfolgreich.

Vielleicht möchten Sie die Implementierung der gesamten Raumbibliothek überprüfen, anstatt sich die abgestürzten Einheimischen anzusehen.

user11221761
quelle
1

Das Problem liegt eher in der richtigen Bibliothek, die nicht im Gradle-Build enthalten ist. Ich hatte ein ähnliches Problem und fügte das fehlende hinzu

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

Saurabh Sharma
quelle
1

Das Ändern der Abhängigkeiten in meiner Gradle-Datei half mir nicht bei der Behebung des Fehlers. Ich hatte diese Datenbankanmerkung in der Klasse verpasst, in der die Raumdatenbank initialisiert wurde, was dieses Problem verursachte.

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

Stellen Sie sicher, dass sich das in der obigen Anmerkung angegebene Entitätsmodell auf die jeweilige Modellklasse bezieht

Wajhia Maqsood
quelle
das ist, was ich verpasst habe
pjwin
0

Für mich hat Android Studio Abhängigkeiten automatisch aktualisiert, sobald Sie Importe aus der Room-Datenbank einbeziehen. Aber gemäß https://developer.android.com/jetpack/androidx/releases/room#declaring_dependencies Sie jedoch einige aktualisieren. So sieht meine Codebasis aus:

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

Aktualisieren Sie das build.gradle wie in einer der Antworten angegeben:

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"

}

Synchronisieren Sie den Gradle und Sie sollten bereit sein zu gehen.

Rujoota Shah
quelle
0

Lesen Sie das Beispiel hier: Raumbeispiel

Ich habe diesen Fehler nur mit der richtigen (ich denke, es ist) annotationProcessorFile wie folgt behoben:

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

Außerdem habe ich entweder in der Room-Version wie in der Lifecycle-Version auf 2.2.0 aktualisiert.

Sobald das Graddle synchronisiert war, konnte ich mit Room arbeiten.

Also viel Glück! Und lass den Code bei dir sein!

Anibal Itriago
quelle
0

In meiner Kotlin-App habe ich gerade die folgende Zeile oben in meiner build.gradle-Datei hinzugefügt:

apply plugin: 'kotlin-kapt'

Und die folgende Zeile im Abschnitt Abhängigkeiten:

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

Ich hoffe, es behebt Ihr Problem.

ZakariaBK
quelle
0

Nicht im Fall von OP, aber dies passiert auch, wenn Sie fälschlicherweise die Implementierung anstelle von annotationProcessor wie folgt verwenden:

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

An Stelle von:

annotationProcessor "android.arch.persistence.room:compiler:x.x.x"
artenson.art98
quelle