web-dev-qa-db-ja.com

部屋に実装が見つかりません

ルームデータベースのテストに問題があります。テストを実行すると、次の例外が発生します。

Java.lang.RuntimeException: cannot find implementation for database.TicketDatabase. TicketDatabase_Impl does not exist
at Android.Arch.persistence.room.Room.getGeneratedImplementation(Room.Java:92)
at Android.Arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.Java:454)
at com.sw.ing.gestionescontrini.DatabaseTest.setDatabase(DatabaseTest.Java:36)
at Java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.Java:24)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.Java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:363)
at org.junit.runners.Suite.runChild(Suite.Java:128)
at org.junit.runners.Suite.runChild(Suite.Java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.Java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.Java:115)
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:1886)

クラスDatabaseTest:

public class DatabaseTest {

    TicketDatabase database;
    DAO ticketDAO;


    @Before
    public void setDatabase() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Context context = InstrumentationRegistry.getTargetContext();
        database = Room.inMemoryDatabaseBuilder(context, TicketDatabase.class).build();

        Method method = TicketDatabase.class.getDeclaredMethod("ticketDao()");
        method.setAccessible(true);
        ticketDAO = (DAO) method.invoke(database, null);
    }
}

gradleファイル:

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 26
    buildToolsVersion '26.0.2'
    defaultConfig {
        applicationId "com.sw.ing.gestionescontrini"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
    }
    defaultConfig {
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.Android.support', module: 'support-annotations'
    })
    compile 'com.Android.support:appcompat-v7:26.+'
    compile 'com.Android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'

    annotationProcessor 'Android.Arch.lifecycle:compiler:1.0.0'
    compile 'Android.Arch.persistence.room:rxjava2:1.0.0-rc1'
    testCompile'Android.Arch.persistence.room:testing:1.0.0-rc1'

}

私はこの実装がどうあるべきか本当に知りません、私は解決策を探しましたが、私が見つけたすべては私のために働きません。たとえば、多くの人がkapt「Android.Arch.persistence.room ...」を追加するソリューションを見つけましたが、gradleは「kapt」を認識しません。

35

kaptはKotlin用です。

まず、追加します:

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

dependenciesクロージャに。

次に、Android.Arch.persistence.room:rxjava2Android.Arch.persistence.room:testing1.0.0ではなく1.0.0-rc1にアップグレードします。

参照: https://developer.Android.com/jetpack/androidx/releases/room

55
CommonsWare

kotlinの場合、gradleファイルの「annotationProcessor」キーワードを「kapt」に変更します。

kapt "Android.Arch.persistence.room:compiler:1.1.1"

また、依存関係ファイルの上に追加します

apply plugin: 'kotlin-kapt'

参照: https://developer.Android.com/jetpack/androidx/releases/room

15
Manzur Alahi

Kotlinを使用する場合は、このコードが成績ファイルに存在することを確認してください。

apply plugin: "kotlin-kapt"

// Room
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"

ドキュメント: https://developer.Android.com/jetpack/androidx/releases/room

7

この辺りの一部の人々(Vishu Bhardwajと同様のStackOverflowの質問に関する他の人々)は、受け入れられた答えが彼らのために働かないと不平を言うのを見ます。私は同様の問題を抱えていたことに言及するに値すると思いますMULTIモジュールプロジェクトで受け入れられた答えの周りにトリックが必要でした。

私のマルチモジュールプロジェクトでは、ルームデータベースの依存関係がほとんど1つの基本モジュールに含まれ、適切なAPI表記を使用してエクスポートされましたが、ルームコードは2つの異なるモジュールに分割されました。警告なしでコンパイルされたプロジェクトJava.lang.RuntimeException:データベースの実装が見つかりません...が実行時に発生しました。

これは追加することで修正されました

annotationProcessor "Android.Arch.persistence.room:compiler:$room_version"

ルーム関連コードを含むすべてのモジュール

3
Grigore Madalin

このgradleはうまく機能します。最初にプラグインkotlin-kaptに注目してください。それは重要です。

apply plugin: 'kotlin-kapt'
apply plugin: 'com.Android.application'
apply plugin: 'kotlin-Android'
apply plugin: 'kotlin-Android-extensions'

Android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "????"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.Android.support:appcompat-v7:28.0.0'
    implementation 'com.Android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.Android.support.test:runner:1.0.2'
    androidTestImplementation 'com.Android.support.test.espresso:espresso-core:3.0.2'

    implementation 'Android.Arch.persistence.room:runtime:1.1.1'
    kapt 'Android.Arch.persistence.room:compiler:1.1.1'
}
1
Ráfagan

上記の答えで誰もが言ったように、私はまだ運がありませんでした。
私の問題は、メインスレッドで挿入を行っていたことです。

roomDatabase = Room.databaseBuilder(DexApplication.getInstance(),MyRoomDatabase.class,"db_name")
                    .fallbackToDestructiveMigration() // this is only for testing, 
                       //migration will be added for release
                    .allowMainThreadQueries() // this solved the issue but remember that its For testing purpose only
                    .build();

説明:

.allowMainThreadQueries() 

メインスレッドでクエリを実行できます。しかし、それを削除して、RxJava、Live Data、またはデータベースを照会するための他のバックグラウンドプロセスメカニズムを実装することを忘れないでください。それが役立つことを願っています。

1
Wajid Ali

以下のプラグインと依存関係を追加

プラグインを適用: 'kotlin-kapt'

kapt "Android.Arch.persistence.room:compiler:1.1.1"

0