调用Room Persistence Library的inMemoryBuilder方法时出现运行时异常

26

在遵循设置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)

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

它只在测试中出现错误吗?还是在开发中也有? - Moinkhan
@Moinkhan 对于两者都抛出相同的错误。 - dxpelou
AppDatabase的包是什么? - yigit
8个回答

48

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

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

这里有同样的问题。这个解决了它。但是回到一个已弃用的注释处理器并不是最优选择。 - Bohsen
2
这对我没有解决问题 - 我已经在使用annotationProcessor了 - galaxigirl
7
apply plugin: 'kotlin-kapt' 是必须的!即使您的构建没有添加它也可以正常工作,但是添加它会使注解处理器的行为发生变化(例如不重命名用于SQL占位符的参数)。 - Randy Sugianto 'Yuku'
别忘了事后清理你的项目。 - user3144836
我在从kapt转换时与Glide发生冲突,我该如何解决? - Phan Sinh
显示剩余2条评论

27

使用Kotlin时的经验之谈:

kapt替代你的annotationProcessor依赖项。同时,在你的应用程序的build.gradle中包含apply plugin:'kotlin-kapt'


谢谢 - 正如你所说的,使用 kapt "android.arch.persistence.room:compiler:$archRoomVersion" 而不是 'annotationProcessor' 就可以完成工作。 - kosiara - Bartosz Kosarzycki

12

请看这个帖子

解决方案是替换:

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

与:

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

2

1

我遇到了同样的问题

  • 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编写数据库实体/DAO和数据库。


0
在我的情况下,我已经更改了方案,但忘记更改版本号。

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


-1

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

-1

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


1
要将此转化为一个好的答案,您应该添加更多信息。为什么这可以解决问题? - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接