tutorial studio room library example ejemplo android implementation android-room

android - studio - Sala no puede encontrar implementación



room database android example (5)

Tengo un problema con la prueba de una base de datos de Room: cuando ejecuto la prueba, obtengo esta excepción:

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)

Prueba de base de datos de clase:

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); } }

archivo de 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'' }

Realmente no sé qué debería ser esta implementación, busqué una solución pero todo lo que encontré no funciona para mí. Por ejemplo, muchos encontraron una solución agregando kapt "android.arch.persistence.room ..." pero gradle no reconoce "kapt".


Este gradle funciona muy bien. Observe el plugin kotlin-kapt al principio. Es 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'' }


Si usa Kotlin, seguro que existe este código en su archivo de calificación.

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


Veo que algunas personas por aquí (Vishu Bhardwaj y otras en preguntas similares de ) se quejan de que la respuesta aceptada no funciona para ellos. Creo que merece la pena mencionar que tuve un problema similar en un proyecto de módulos MULTI que necesitaba un truco en torno a la respuesta aceptada.

En mi proyecto de módulos múltiples, las dependencias de la base de datos de la sala se incluyeron principalmente en un módulo básico y se exportaron utilizando la notación api adecuada, pero el código de la sala se dividió en 2 módulos diferentes. Proyecto compilado sin advertencia, pero java.lang.RuntimeException: no se puede encontrar la implementación para la base de datos ... se generó en tiempo de ejecución.

Esto fue arreglado agregando

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

en TODOS los módulos que incluyeron código relacionado con la Habitación .


para Kotlin, cambie la palabra clave ''annotationProcessor'' a ''kapt'' en el archivo gradle.

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


kapt es para Kotlin.

Primero, agregue:

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

A su cierre de dependencies .

Luego, actualice android.arch.persistence.room:rxjava2 y android.arch.persistence.room:testing a 1.0.0 lugar de 1.0.0-rc1 .