La bibliothèque de persistance de la salle fonctionne l'exception de temps lors de L'appel de salles dans la méthode de construction
en suivant le tutoriel pour la mise en place de la bibliothèque Room persistence, j'ai lancé cette erreur lors d'un test sur un appareil Android.
de java.lang.RuntimeException: impossible de trouver une implémentation pour nom du paquet .AppDatabase. AppDatabase_Impl n'existe pas
je sais qu'une question similaire a été posée mais les problèmes étaient dus à Kotlin gradle problèmes. Double
Classe D'épreuve:
@RunWith(AndroidJUnit4.class)
public class LocalDatabaseTest {
private PhotoDao mPhotoDao;
private AppDatabase mDb;
@Before
public void createDb() {
Context context = InstrumentationRegistry.getTargetContext();
mDb = Room.inMemoryDatabaseBuilder(context.getApplicationContext(), AppDatabase.class).build();
mPhotoDao = mDb.photoDao();
}
@After
public void closeDb() throws IOException {
//mDb.close();
}
@Test
public void testPreConditions() {
assertNotNull(mDb);
}
Dao:
@Dao
public interface PhotoDao {
@Delete()
public void delete(Photo... photos);
@Update
public void update(Photo ... photos);
@Insert
public void insert(Photo ... photos);
}
de la Base de données:
@Database(entities = {Photo.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract PhotoDao photoDao();
}
Trace De Pile:
java.lang.RuntimeException: cannot find implementation for *PackageName*.AppDatabase. AppDatabase_Impl does not exist
at android.arch.persistence.room.Room.getGeneratedImplementation(Room.java:90)
at android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:340)
at pics.chooz.choozpics.LocalDatabaseTest.createDb(LocalDatabaseTest.java:40)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1853)
Gradle:
apply plugin: "com.android.application"
apply plugin: "android-apt"
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "*Package Name*"
minSdkVersion 16
targetSdkVersion 25
versionCode 50
versionName "1.0.32"
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
dexOptions {
javaMaxHeapSize "4g"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
debug {
debuggable true
}
}
lintOptions {
abortOnError false
disable "ResourceType"
}
sourceCompatibility = 1.7
targetCompatibility = 1.7
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
packagingOptions {
exclude 'META-INF/ASL2.0'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
}
}
dependencies {
androidTestCompile "com.android.support:support-annotations:$androidVersion"
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
compile "android.arch.persistence.room:runtime:1.0.0-alpha1"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1"
}
7 réponses
j'ai changé le mot clé 'annotationProcessor' en 'kapt' dans mon fichier gradle. Comme ceci:
kapt "android.arch.persistence.room:compiler:1.0.0"
Règle de base lors de l'utilisation de Kotlin:
remplacer vos dépendances annotationProcessor
par kapt
. Incluez aussi apply plugin: 'kotlin-kapt'
dans votre application build.gradle
.
Avoir un coup d'oeil sur ce fil
la solution est de remplacer:
annotationProcessor "android.arch.persistence.room:compiler:VERSION"
avec:
kapt "android.arch.persistence.room:compiler:VERSION"
vous devez ajouter la dépendance du processeur d'annotation au module où se trouve votre AppDatabase. J'ai supposé que l'application prendrait la depencency de mon module de bibliothèque D'API, où se trouvent mes classes de modèles de données, mais apparemment ce n'est pas le cas.
la réponse est venue de cette question de google: https://issuetracker.google.com/issues/67520422 Et ce AFIN de répondre à: https://stackoverflow.com/a/43918701/1959110
avait le même problème avec
- Grad 3.2.0-alpha09
- koltin 1.2.31
en Raison de la suppression de apply plugin: 'kotlin-kapt'
et d'autres buggy choses.. J'ai dû rétrograder à Kotlin 1.1.60 pour que ça marche. Puis utiliser:
apply plugin: 'kotlin-kapt'
dependencies {
...
implementation 'android.arch.persistence.room:runtime:1.0.0'
kapt "android.arch.persistence.room:compiler:1.0.0"
}
une autre option serait d'écrire les entités DB/DAOs et la base de données en Java à la place.
pour kotlin
//Room
implementation "android.arch.persistence.room:runtime:1.0.0"
//Room annotation processor
kapt "android.arch.persistence.room:compiler:1.0.0"
apply plugin: 'kotlin-kapt'
changer le processeur d'annotation du processeur d'Annotation android.Arch.persistance.salle:exécution: 1.1.0 ' à annotationprocesseur " android.Arch.persistance.salle: compilateur: 1.1.0'