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