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
}
}
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.
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'
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
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.
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
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"
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.
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:
Ich verstehe dieses Verhalten nicht, da gesagt wird, dass der Parameter optional ist, siehe __. https://stackoverflow.com/a/44645943/3258117
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
}
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'
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);
}
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"
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.
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.
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