tutorial studio room library example ejemplo codelabs java android sqlite orm android-room

java - studio - room persistence library example



Excepción de tiempo de ejecución de Room Persistence Library al llamar al método Rooms inMemoryBuilder (7)

Al seguir el tutorial para configurar la biblioteca de persistencia de habitaciones, me encuentro con este error al probar en un dispositivo Android.

java.lang.RuntimeException: no se puede encontrar la implementación para PackageName .AppDatabase. AppDatabase_Impl no existe

Sé que se ha formulado una pregunta similar, sin embargo, los problemas se debieron a problemas de Kotlin Gradle. Posible duplicado

Clase de prueba

@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 datos:

@Database(entities = {Photo.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract PhotoDao photoDao(); }

Traza de la pila:

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


Regla de oro cuando se usa Kotlin:

Reemplace sus dependencias de annotationProcessor kapt con kapt . Además, incluye el apply plugin: ''kotlin-kapt'' en el apply plugin: ''kotlin-kapt'' de tu aplicación.


Cambié la palabra clave ''annotationProcessor'' a ''kapt'' en mi archivo de gradle. Al igual que:

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


Debe agregar la dependencia del procesador de anotaciones al módulo donde se encuentra la base de datos de la aplicación. Asumí que la aplicación tomaría la dependencia de mi módulo de biblioteca API, donde están mis clases de modelo de datos, pero aparentemente este no es el caso.

La respuesta provino de este problema de Google: https://issuetracker.google.com/issues/67520422 Y esta respuesta SO: https://.com/a/43918701/1959110


Echa un vistazo a este hilo

La solución es reemplazar:

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

con :

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


Para 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''


Tuvo el mismo problema con

  • gradle 3.2.0-alpha09
  • Koltin 1.2.31

Debido a la eliminación del apply plugin: ''kotlin-kapt'' de apply plugin: ''kotlin-kapt'' y otras cosas con errores ... Tuve que bajar a kotlin 1.1.60 para que funcione. Luego use:

apply plugin: ''kotlin-kapt'' dependencies { ... implementation ''android.arch.persistence.room:runtime:1.0.0'' kapt "android.arch.persistence.room:compiler:1.0.0" }

otra opción sería escribir las entidades de DB / DAOs y DataBase en Java en su lugar.


cambie el annotationProcessor de annotationProcessor ''android.arch.persistence.room:runtime:1.1.0'' a annotationProcessor ''android.arch.persistence.room:compiler:1.1.0''