web-dev-qa-db-fra.com

Exception d'exécution de la bibliothèque de persistance de salles lors de l'appel de la méthode Rooms inMemoryBuilder

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"
}
25
dxpelou

J'ai changé le mot clé 'annotationProcessor' en 'kapt' dans mon fichier gradle. Ainsi:

kapt "Android.Arch.persistence.room:compiler:1.0.0"
45
dxpelou

Règle générale lors de l'utilisation de Kotlin:

Remplacez vos dépendances annotationProcessor par kapt. En outre, inclure apply plugin: 'kotlin-kapt' dans votre application build.gradle.

27
Solidak

Regardez ce fil

La solution consiste à remplacer:

annotationProcessor "Android.Arch.persistence.room:compiler:VERSION"

avec :

kapt "Android.Arch.persistence.room:compiler:VERSION"
11
Simon Rolin

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

2
galaxigirl

Eu le même problème avec

  • gradle 3.2.0-alpha09
  • koltin 1.2.31

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.

1
Javatar