110 votes

La salle ne peut pas trouver la mise en œuvre

J'ai un problème avec le test d'une base de données Room : lorsque je lance le test, j'obtiens cette exception :

java.lang.RuntimeException: cannot find implementation for database.TicketDatabase. TicketDatabase_Impl does not exist
at android.arch.persistence.room.Room.getGeneratedImplementation(Room.java:92)
at android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:454)
at com.sw.ing.gestionescontrini.DatabaseTest.setDatabase(DatabaseTest.java:36)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
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:1886)

Classe DatabaseTest :

public class DatabaseTest {

    TicketDatabase database;
    DAO ticketDAO;

    @Before
    public void setDatabase() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Context context = InstrumentationRegistry.getTargetContext();
        database = Room.inMemoryDatabaseBuilder(context, TicketDatabase.class).build();

        Method method = TicketDatabase.class.getDeclaredMethod("ticketDao()");
        method.setAccessible(true);
        ticketDAO = (DAO) method.invoke(database, null);
    }
}

fichier gradle :

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion '26.0.2'
    defaultConfig {
        applicationId "com.sw.ing.gestionescontrini"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    defaultConfig {
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'

    annotationProcessor 'android.arch.lifecycle:compiler:1.0.0'
    compile 'android.arch.persistence.room:rxjava2:1.0.0-rc1'
    testCompile'android.arch.persistence.room:testing:1.0.0-rc1'

}

Je ne sais pas vraiment ce que cette mise en œuvre devrait être, j'ai cherché une solution mais tout ce que j'ai trouvé ne fonctionne pas pour moi. Par exemple, beaucoup ont trouvé une solution en ajoutant kapt "Android.arch.persistence.room..." mais gradle ne reconnaît pas "kapt".

1 votes

J'ai le même problème. La réponse acceptée ne fonctionne pas pour moi. Veuillez m'aider si vous avez trouvé une solution. Voici les dépendances : compile 'Android.arch.persistence.room:runtime:1.1.0' annotationProcessor 'Android.arch.persistence.room:compiler:1.1.0' compile 'Android.arch.persistence.room:rxjava2:1.1.0'.

1 votes

@VishuBhardwaj Vérifiez que vous avez une annotation pour la base de données au-dessus de la classe de base de données comme ceci : @Database(entities = {Entities.class}, version = 1, exportSchema = true)

109voto

CommonsWare Points 402670

kapt est pour Kotlin.

D'abord, ajoutez :

annotationProcessor "android.arch.persistence.room:compiler:1.0.0"

à votre dependencies fermeture.

Ensuite, mettez à niveau android.arch.persistence.room:rxjava2 y android.arch.persistence.room:testing a 1.0.0 au lieu de 1.0.0-rc1 .

réf : https://developer.Android.com/jetpack/androidx/releases/room

6 votes

Pour changer en kapt au lieu d'annotationProcessor a fonctionné pour moi

32 votes

N'oubliez pas de mettre apply plugin: 'kotlin-kapt' en haut de votre build.gradle si vous utilisez kapt . :)

0 votes

Je ne suis pas sûr que cette réponse ait fonctionné pour le PO puisqu'il ne semble pas utiliser Kotlin...

59voto

Manzur Alahi Points 424

Pour Kotlin, remplacez le mot clé 'annotationProcessor' par 'kapt' dans le fichier gradle.

kapt "android.arch.persistence.room:compiler:1.1.1"

et ajoutez également au dessus du fichier de dépendance

apply plugin: 'kotlin-kapt'

réf : https://developer.Android.com/jetpack/androidx/releases/room

32voto

Si vous utilisez Kotlin, assurez-vous qu'il existe ce code dans votre fichier grade.

apply plugin: "kotlin-kapt"

// Room
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"

Documentation : https://developer.Android.com/jetpack/androidx/releases/room

13voto

Grigore Madalin Points 31

Je vois certaines personnes ici (Vishu Bhardwaj et d'autres sur des questions similaires de StackOverflow) se plaindre que la réponse acceptée ne fonctionne pas pour eux. Je pense qu'il est bon de mentionner que j'ai eu un problème similaire. dans un projet à modules multiples qui avait besoin d'une astuce pour contourner la réponse acceptée.

Dans mon projet multi-modules, les dépendances de la base de données des chambres sont incluses dans un module de base et exportées en utilisant la notation api appropriée, mais le code de la chambre est divisé en deux modules différents. Le projet a été compilé sans avertissement mais java.lang.RuntimeException : impossible de trouver une implémentation pour la base de données... a été soulevée lors de l'exécution.

Cela a été corrigé en ajoutant

annotationProcessor "android.arch.persistence.room:compiler:$room_version"

dans TOUS les modules qui comprenaient du code relatif à la salle .

4voto

Ráfagan Points 810

Ce gradle fonctionne très bien. Remarquez le plugin kotlin-kapt au début. C'est crucial.

apply plugin: 'kotlin-kapt'
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "????"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation 'android.arch.persistence.room:runtime:1.1.1'
    kapt 'android.arch.persistence.room:compiler:1.1.1'
}

1 votes

Merci, @Ráfagan. La ligne "apply plugin : 'kotlin-kapt' a fait ma journée :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X