调用Rooms inMemoryBuilder方法时,Room Persistence Library运行时exception
当遵循设置Room持久性库的教程时,我在Android设备上测试时遇到此错误。
java.lang.RuntimeException:找不到PackageName .AppDatabase的实现。 AppDatabase_Impl不存在
我知道有一个类似的问题,但问题是由于kotlin gradle问题。 可能重复
测试课:
@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 public interface PhotoDao { @Delete() public void delete(Photo... photos); @Update public void update(Photo ... photos); @Insert public void insert(Photo ... photos); }
数据库:
@Database(entities = {Photo.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract PhotoDao photoDao(); }
堆栈跟踪:
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)
摇篮:
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" }
我在我的gradle文件中将“annotationProcessor”关键字更改为“kapt”。 像这样:
kapt "android.arch.persistence.room:compiler:1.0.0"
使用Kotlin时的经验法则:
将您的annotationProcessor
依赖关系替换为kapt
。 另外,在应用程序的build.gradle
包含apply plugin: 'kotlin-kapt'
。
看看这个线程
解决方案是取代:
annotationProcessor "android.arch.persistence.room:compiler:VERSION"
与:
kapt "android.arch.persistence.room:compiler:VERSION"
您必须将注释处理器依赖项添加到您的AppDatabase所在的模块中。 我认为应用程序将从我的API库模块中取得我的数据模型类的依赖性,但显然情况并非如此。
回答来自这个谷歌问题: https : //issuetracker.google.com/issues/67520422而这个回答: https : //stackoverflow.com/a/43918701/1959110
- kotlin库模块中调试目录的未解决的参考
- 点击触摸事件填充整个屏幕
- RxJava Observable.create包装可观察订阅
- 如何实现一个延迟加载recyclerView适配器,像使用kotlin的realm recyclerView适配器
- 来自内部存储的Intent.ACTION_SEND PDF文件仅适用于某些应用程序
- Bug – 无法更改supportActionBar标题
- Android RxJava / Kotlin – 将大量数据映射到网络呼叫
- 在Android Studio中不能识别的多维度味道的测试源目录
- 数据列表没有显示在Android应用程序的主要活动的回收站视图中,使用kotlin进行开发。