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