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
}
}
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.
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'
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
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.
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
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"
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.
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:
Je ne comprends pas ce comportement car le paramètre est dit optionnel, voir https://stackoverflow.com/a/44645943/3258117
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
}
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'
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);
}
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"
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é.
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.
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