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
.