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

  • 在sqlite中更改列中的值
  • 从sqlite数据库Android获取最后插入的值
  • 如何使Android SQLite数据库上的AUTO_INCREMENT?
  • Sqlite数据库中的.db-shm和.db-wal扩展名是什么?
  • 如何使用osmdroid通过将地图图块图像保存到sqlite数据库来实现离线地图?
  • 使用内存中的sqlite android
  • 获取更新的行从Android中的SQLite使用原始查询计数?
  • 使用CursorLoader查询SQLite DB并填充AutoCompleteTextView
  • 我在gradle文件中将’annotationProcessor’关键字更改为’kapt’。 像这样:

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

    使用Kotlin时的经验法则:

    kapt替换annotationProcessor依赖kapt 。 另外,在应用程序的build.gradle包含apply plugin: 'kotlin-kapt'

    看看这个post

    解决方案是替换:

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

    用:

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

    您必须将注释处理器依赖项添加到AppDatabase所在的模块。 我假设应用程序将从我的API库模块中获取依赖性,我的数据模型类在那里,但显然情况并非如此。

    答案来自这个谷歌问题: https : //issuetracker.google.com/issues/67520422这个SO回答: https : //stackoverflow.com/a/43918701/1959110

    有同样的问题

    • gradle 3.2.0-alpha09
    • 科尔廷1.2.31

    由于删除了apply plugin: 'kotlin-kapt'和其他有缺陷的东西..我不得不降级到kotlin 1.1.60以使其正常工作。 然后使用:

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

    另一种选择是用Java编写DB实体/ DAO和DataBase。

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

    将annotationProcessor从annotationProcessor’android.arch.persistence.room:runtime:1.1.0’更改为annotationProcessor’android.arch.persistence.room:compiler:1.1.0′