【问题标题】:Room Persistence Library run time exception when calling Rooms inMemoryBuilder method调用 Rooms inMemoryBuilder 方法时,Room Persistence Library 运行时异常
【发布时间】:2017-11-09 01:43:21
【问题描述】:

按照教程设置 Room 持久性库时,我在 Android 设备上进行测试时遇到了这个错误。

java.lang.RuntimeException:找不到 PackageName.AppDatabase 的实现。 AppDatabase_Impl 不存在

我知道有人问过类似的问题,但问题是由于 kotlin gradle 问题造成的。 Possible Duplicate

测试类:

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

【问题讨论】:

  • 是否只在测试中抛出错误?还是在开发中。?
  • @Moinkhan 对两者都抛出相同的错误
  • AppDatabase 的包是什么?

标签: java android sqlite orm android-room


【解决方案1】:

我在我的 gradle 文件中将“annotationProcessor”关键字更改为“kapt”。像这样:

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

【讨论】:

  • 这里有同样的问题。这解决了它。不过,回到已弃用的注释处理器并不是最佳选择。
  • 这并没有为我解决 - 我已经在使用 annotationProcessor
  • apply plugin: 'kotlin-kapt' 是必须的!即使您的构建在不添加它的情况下工作,添加它也会使注释处理器的行为有所不同(例如,不重命名 SQL 占位符所需的参数)
  • 之后别忘了清理你的项目。
  • 我在更改为 kapt 时与 Glide 发生冲突。我该如何解决?
【解决方案2】:

使用 Kotlin 时的经验法则:

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

【讨论】:

  • 谢谢 - 正如你所说的 kapt "android.arch.persistence.room:compiler:$archRoomVersion" 而不是 'annotationProcessor' 完成这项工作
【解决方案3】:

看看this thread

解决办法是更换:

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

与:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      遇到同样的问题

      • gradle 3.2.0-alpha09
      • koltin 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 和数据库。

      【讨论】:

        【解决方案6】:

        就我而言,我有更改方案但忘记更改版本号。

        @Database(entities = {Task1.class, Task2.class}, version = 2)

        【讨论】:

          【解决方案7】:

          对于科特林

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

            • 要将其变成一个好的答案,您应该添加更多信息。为什么这能解决问题?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-22
            • 2018-03-28
            • 2018-06-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多