Ответ 1
Я изменил ключевое слово 'annotationProcessor' на 'kapt' в моем файле gradle. Например:
kapt "android.arch.persistence.room:compiler:1.0.0"
Когда вы следуете руководству по настройке библиотеки сохранения номеров, я запускаю эту ошибку при тестировании на устройстве 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' на 'kapt' в моем файле gradle. Например:
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. Я предположил, что приложение возьмет depencency из моего модуля библиотеки API, где мои классы моделей данных, но, видимо, это не так.
Ответ пришел из этой проблемы google: https://issuetracker.google.com/issues/67520422 И это ответ: fooobar.com/questions/419812/...
Была такая же проблема с
Из-за удаления 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"
}
другой вариант - вместо этого писать сущности БД /DAO и базу данных на Java.
В моем случае я изменил схему, но забыл изменить номер версии.
@Database(entities = {Task1.class, Task2.class}, version = 2)
Для котлина
//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'
измените annotationProcessor с annotationProcessor 'android.arch.persistence.room:runtime:1.1.0' на annotationProcessor 'android.arch.persistence.room:compiler:1.1.0'