ルーム永続性ライブラリを設定するためのチュートリアルに従うと、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"
}
私のgradleファイルで「annotationProcessor」キーワードを「kapt」に変更しました。そのようです:
kapt "Android.Arch.persistence.room:compiler:1.0.0"
annotationProcessor
依存関係をkapt
に置き換えます。また、apply plugin: 'kotlin-kapt'
アプリのbuild.gradle
。
このスレッド をご覧ください
解決策は以下を置き換えることです:
annotationProcessor "Android.Arch.persistence.room:compiler:VERSION"
で:
kapt "Android.Arch.persistence.room:compiler:VERSION"
AppDatabaseがあるモジュールに注釈プロセッサの依存関係を追加する必要があります。アプリは、データモデルクラスがあるAPIライブラリモジュールから依存関係を取得すると想定しましたが、明らかにそうではありません。
このGoogleの問題からの回答: https://issuetracker.google.com/issues/67520422 そして、このSO answer: https:// stackoverflow .com/a/43918701/195911
と同じ問題を抱えていた
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およびデータベースを書き込むことです。