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"
}
24
demandé sur Cœur 2017-06-07 18:37:36

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"
40
répondu dxpelou 2018-02-06 22:57:30

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 .

21
répondu Solidak 2017-11-20 14:31:37

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"
10
répondu Simon Rolin 2017-10-15 15:23:37

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

2
répondu galaxigirl 2017-11-21 15:17:06

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.

1
répondu Javatar 2018-04-12 08:34:40

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'
0
répondu Shaon 2018-04-21 16:56:55

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'

-1
répondu Musa Abdul Wadud 2018-06-19 14:44:45