Lorsque je suis le didacticiel de configuration de la bibliothèque de persistance de salle, je rencontre cette erreur lorsque je teste un périphérique Android.
Java.lang.RuntimeException: impossible de trouver l'implémentation de PackageName . AppDatabase. AppDatabase_Impl n'existe pas
Je sais qu'une question similaire a été posée, mais les problèmes étaient dus aux problèmes de Kotlin Gradle. doublon possible
Classe de test:
@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);
}
Base de données:
@Database(entities = {Photo.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract PhotoDao photoDao();
}
Trace de la 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"
}
J'ai changé le mot clé 'annotationProcessor' en 'kapt' dans mon fichier gradle. Ainsi:
kapt "Android.Arch.persistence.room:compiler:1.0.0"
Remplacez vos dépendances annotationProcessor
par kapt
. En outre, inclure apply plugin: 'kotlin-kapt'
dans votre application build.gradle
.
Regardez ce fil
La solution consiste à 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 dépendance de mon module de bibliothèque API, où sont mes classes de modèle de données, mais apparemment ce n'est pas le cas.
La réponse provenait de ce problème Google: https://issuetracker.google.com/issues/67520422 Et ceci SO réponse: https: // stackoverflow .com/a/43918701/195911
Eu le même problème avec
En raison de la suppression de apply plugin: 'kotlin-kapt'
et d’autres choses boguées. J'ai dû revenir à kotlin 1.1.60 pour que cela fonctionne. Alors utilisez:
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 consisterait à écrire les entités de base de données/DAO et la base de données dans Java à la place.