web-dev-qa-db-fra.com

Persistance de la salle Android: AppDatabase_Impl n'existe pas

Ma classe de base de données d'application

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

Et quand je demande par exemple que cela donnera cette erreur, AppDatabase_Impl n’existe pasDans ma classe d’application

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

Pour ceux qui travaillent avec Kotlin, essayez de changer annotationProcessor en kapt dans les applications build.gradle

par exemple:

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

n'oubliez pas également d'ajouter apply: 'kotlin-kapt' en haut du fichier build.gradle au niveau de l'application et d'effectuer un nettoyage et une reconstruction (selon https://codelabs.developers.google.com/codelabs/Android- chambre avec vue/# 6 )

Dans Android Studio, si vous obtenez des erreurs lorsque vous collez du code ou pendant le processus de construction, sélectionnez Générer> Nettoyer le projet. Ensuite, sélectionnez Construire> Reconstruire le projet, puis compilez à nouveau. 

133
RWIL

Juste utiliser 

apply plugin: 'kotlin-kapt'

dans l'application build.gradle

Et garder les deux dans les dépendances

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

MODIFIER

Dans les versions plus récentes, il n'est pas nécessaire d'ajouter les deux dépendances à la fois .__ Utilisez, espérez que cela fonctionnera.

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

J'ai eu cette erreur quand j'ai raté 

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

Assurez-vous que le modèle d'entité spécifié dans l'annotation ci-dessus fait référence à la classe de modèle particulière et que l'annotation nécessaire:

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

est correctement défini et vous seriez bon

12
Ainojie Ajayi

si vous utilisez des classes kotlin pour implémenter une base de données, utilisez

apply plugin: 'kotlin-kapt'

et

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

dans votre fichier de classement, cela fonctionnera.

7
navalkishoreb

Il ne s'agit pas simplement de mettre à jour vos dépendances. Assurez-vous que toutes vos dépendances Room ont la même version.

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"

Dans l'extrait de code ci-dessus, toutes les dépendances de ma pièce ont la même version 1.1.0-alpha2

6
Idee

Pour les développeurs Kotlin

Utilisez ceci:

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

Et ajoutez apply plugin: 'kotlin-kapt' en haut du niveau d'application build.gradle.

Pour les développeurs Java

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

J'ai rencontré ce problème parce que j'ai oublié les dépendances 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"

après avoir ajouté annotationProcessor et reconstruit, le problème a été résolu.

4
ahsiu

Avait le même problème. Implémentation des quelques classes et interfaces décrites officiellement dans un nouvel exemple de projet créé par Android Studio: https://developer.Android.com/training/data-storage/room/

Toutes les solutions mentionnées ci-dessus n'ont pas aidé, les fichiers _Impl nécessaires selon ma classe de base de données n'ont pas été générés par Room. Enfin, l’exécution de gradle clean dans le terminal m’a donné l’indice qui a conduit à la solution:

"avertissement: le répertoire d'exportation de schéma n'est pas fourni au processeur d'annotation, nous ne pouvons donc pas exporter le schéma. Vous pouvez soit fournir l'argument du processeur d'annotation room.schemaLocation OR définir exportSchema sur false."

J'ai ajouté le paramètre exportSchema = false dans la classe de base de données

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

Et puis cela a fonctionné, a trouvé ces deux fichiers générés dans le module d'application sous généréJava:

  • AppDatabase_Impl
  • UserDao_Impl

Je ne comprends pas ce comportement car le paramètre est dit optionnel, voir https://stackoverflow.com/a/44645943/3258117

2
Hajo

Utilisez le lien de classement suivant:

compile 'Android.Arch.persistence.room:runtime:1.0.0-alpha9'
annotationProcessor 'Android.Arch.persistence.room:compiler:1.0.0-alpha9'

Vous devez créer une classe singloton différente et obtenir la base de données App de la manière suivante:

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
Burhanuddin Rashid

assurez-vous d'ajouter la dépendance correcte pour la pièce dans 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"

Et au-dessous de la ligne en haut

apply plugin: 'kotlin-kapt'
2
Deepak

Je rencontre le problème car j'oublie l'annotation @Dao

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

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

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

Tutoriel officiel de la salle

2
shellhub

La question est assez ancienne, mais je suis tombée sur cette question aujourd'hui et aucune des réponses fournies ne m'a aidé. Enfin, j’ai réussi à le résoudre en remarquant que Google documentation est toujours adopté à Java et non à Kotlin par défaut. En fait, ils ont ajouté un commentaire que j’ai ignoré.

Pour Kotlin, utilisez kapt au lieu de annotationProcessor

Donc, au lieu de

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

Si vous développez avec Kotlin, vous devez utiliser:

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

Dans mon cas, je testais la connectivité pour la base de données de salle et j'ai placé la classe testing dans le répertoire que j'ai créé dans le dossier AndroidTest. Je l'ai déplacé du répertoire personnalisé, alors cela a plutôt bien fonctionné.

1
Farruh Habibullaev

Le même phénomène s'est produit pour moi.

suivant

implementation "Android.Arch.persistence.room:runtime:1.1.1"

L'ajout cause une autre erreur de construction mais en suit la cause dans le journal.

Dans mon cas, il y avait une erreur dans l'implémentation SQL. Après réparation, la construction a réussi.

Donc, vous voudrez peut-être vérifier l’implémentation de la bibliothèque de salle entière au lieu de regarder les sections locales écrasées.

0
user11221761

Le problème concerne plutôt la bonne bibliothèque qui n’est pas incluse dans la construction de gradle. J'ai eu un problème similaire et ajouté les disparus 

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

0
Saurabh Sharma