房间持久库在呼叫室Inmemorybuilder方法时运行时间异常



在遵循教程以设置房间持久库时,我在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:

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

我将'AnnotationProcessor'关键字更改为gradle文件中的'kapt'。喜欢:

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

使用kotlin时经验法则:

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

在此线程上查看

解决方案是替换:

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

with:

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

您必须将注释处理器依赖关系添加到AppDatabase所在的模块中。我以为该应用程序将从我的数据模型类所在的API库模块中获取depencency,但显然不是这样。

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

有相同的问题
  • 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实体/DAOS和数据库。

在我的情况下,我有更改方案,但忘了更改版本号。

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'

从Annotation Processor'android.ark.persistence.Room.Runtime:1.1.0'更改AnnotationProcessor AnnotationProcessor'android.ark.persistence.Room:1.1.0'

相关内容

最新更新