web-dev-qa-db-ja.com

Rooms inMemoryBuilderメソッドを呼び出すときのRoom Persistence Libraryランタイム例外

ルーム永続性ライブラリを設定するためのチュートリアルに従うと、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"
}
25
dxpelou

私のgradleファイルで「annotationProcessor」キーワードを「kapt」に変更しました。そのようです:

kapt "Android.Arch.persistence.room:compiler:1.0.0"
45
dxpelou

Kotlinを使用する場合の経験則:

annotationProcessor依存関係をkaptに置き換えます。また、apply plugin: 'kotlin-kapt'アプリのbuild.gradle

27
Solidak

このスレッド をご覧ください

解決策は以下を置き換えることです:

annotationProcessor "Android.Arch.persistence.room:compiler:VERSION"

で:

kapt "Android.Arch.persistence.room:compiler:VERSION"
11
Simon Rolin

AppDatabaseがあるモジュールに注釈プロセッサの依存関係を追加する必要があります。アプリは、データモデルクラスがあるAPIライブラリモジュールから依存関係を取得すると想定しましたが、明らかにそうではありません。

このGoogleの問題からの回答: https://issuetracker.google.com/issues/67520422 そして、このSO answer: https:// stackoverflow .com/a/43918701/195911

2
galaxigirl

と同じ問題を抱えていた

  • 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およびデータベースを書き込むことです。

1
Javatar