wake-up-neo.net

Android-Raum dauerhaft: AppDatabase_Impl ist nicht vorhanden

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 nach einem Beispiel frage, wird dieser Fehler ausgegeben, AppDatabase_Impl ist nicht vorhandenin 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

    }   

}
60
pratik deshai

Wenn Sie mit Kotlin arbeiten, ändern Sie annotationProcessor in kapt in den Apps build.gradle.

zum Beispiel:

// 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, das anwendbare Plugin: 'kotlin-kapt' oben in der Build.gradle-Datei der App-Ebene hinzuzufügen und eine Neu-Erstellung durchzuführen (entsprechend https://codelabs.developers.google.com/codelabs/Android) -room-with-a-view/# 6 )

Wenn Sie beim Einfügen von Code oder während des Erstellungsprozesses in Android Studio Fehler erhalten, wählen Sie „Erstellen“> „Projekt reinigen“. Wählen Sie dann Erstellen> Projekt neu erstellen und erstellen Sie dann erneut. 

133
RWIL

Benutz einfach 

apply plugin: 'kotlin-kapt'

in der App build.gradle

Und beides in Abhängigkeiten halten

annotationProcessor "Android.Arch.persistence.room:compiler:$rootProject.roomVersion"
kapt "Android.Arch.persistence.room:compiler:$rootProject.roomVersion"

EDIT

In der neueren Version müssen nicht beide Abhängigkeiten gleichzeitig hinzugefügt werden

kapt 'Android.Arch.persistence.room:compiler:1.1.1'
47
Jahangir Kabir

Ich hatte diesen Fehler, als ich vermisst habe 

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

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

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

ist richtig definiert und du würdest gut sein

12
Ainojie Ajayi

wenn Sie Kotlin-Klassen verwenden, um die Datenbank zu implementieren, verwenden Sie

apply plugin: 'kotlin-kapt'

und

kapt "Android.Arch.persistence.room:compiler:1.1.1"

in deiner gradle datei wird es funktionieren.

7
navalkishoreb

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 Raumabhängigkeiten dieselbe Version 1.1.0-alpha2

6
Idee

Für Kotlin-Entwickler

Benutze das:

implementation "Android.Arch.persistence.room:runtime:1.0.0"
kapt "Android.Arch.persistence.room:compiler:1.0.0"

Fügen Sie apply plugin: 'kotlin-kapt' oben auf App-Ebene build.gradle hinzu.

Für Java-Entwickler

implementation "Android.Arch.persistence.room:runtime:1.0.0"
annotationProcessor "Android.Arch.persistence.room:compiler:1.0.0"
4
Pedro Massango

Ich bin diesem Problem begegnet, weil ich die 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 der AnnotationProcessor hinzugefügt und neu erstellt wurde, wurde das Problem behoben.

4
ahsiu

Hatte das gleiche Problem. Implementierte die wenigen Klassen und Schnittstellen, wie in einem neuen, von Android Studio erstellten Beispielprojekt offiziell gesagt: 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 Ausführen von Gradle Clean Build in Terminal gab mir schließlich den Hinweis, der zur Lösung führte:

"warning: Das Schemaexportverzeichnis wird dem Anmerkungsprozessor nicht zur Verfügung gestellt, daher können wir das Schema nicht exportieren. Sie können entweder das room.schemaLocation Annotationsprozessorargument OR angeben, das exportSchema auf false gesetzt hat."

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 funktionierte es, diese beiden generierten Dateien im App-Modul unter generatedJava zu finden:

  • AppDatabase_Impl
  • UserDao_Impl

Ich verstehe dieses Verhalten nicht, da gesagt wird, dass der Parameter optional ist, siehe __. https://stackoverflow.com/a/44645943/3258117

2
Hajo

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 unterschiedliche 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
}
2

stellen Sie sicher, dass Sie in build.gradle die richtige Abhängigkeit für den Raum 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 dem Strich oben

apply plugin: 'kotlin-kapt'
2
Deepak

Ich treffe das Problem, weil ich @Dao Annotation vergessen habe

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

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

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

Offizielles Tutorial des Zimmers

2
shellhub

Die Frage ist ziemlich alt, aber ich bin heute darauf gestoßen, und keine der angebotenen Antworten hat mir geholfen. Schließlich konnte ich es lösen, indem ich bemerkte, dass google documentation 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"
2
Pavel

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

1

Das gleiche Phänomen ist mir aufgefallen.

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 Fixieren war der Build erfolgreich.

Sie können also die Implementierung der gesamten Raumbibliothek überprüfen, anstatt sich die abgestürzten Einheimischen anzusehen.

0
user11221761

Das Problem betrifft eher die richtige Bibliothek, die nicht im Gradle-Build enthalten ist. Ich hatte ein ähnliches Problem und fügte das Vermisste hinzu 

testImplementation "Android.Arch.persistence.room:testing:$room_version

0
Saurabh Sharma