Room Persistence Library 运行 调用 Rooms inMemoryBuilder 方法时出现时间异常
Room Persistence Library run time exception when calling Rooms inMemoryBuilder method
按照教程设置 Room 持久性库时,我 运行 在 Android 设备上测试时遇到此错误。
java.lang.RuntimeException:找不到 PackageName.AppDatabase 的实现。 AppDatabase_Impl不存在
我知道有人问过类似的问题,但这些问题是由于 kotlin gradle 问题引起的。
测试class:
@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 "android.arch.persistence.room:compiler:VERSION"
与 :
kapt "android.arch.persistence.room:compiler:VERSION"
您必须将注释处理器依赖项添加到您的 AppDatabase 所在的模块。我假设该应用程序将从我的 API 库模块中获取依赖项,我的数据模型 类 所在的模块,但显然情况并非如此。
答案来自这个 google 问题:
https://issuetracker.google.com/issues/67520422
而这个 SO 答案:
使用 Kotlin 的经验法则:
将您的 annotationProcessor
依赖项替换为 kapt
。此外,在您应用的 build.gradle
.
中包含 apply plugin: 'kotlin-kapt'
与
有同样的问题
- 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 中写入数据库 entities/DAOs 和数据库。
对于科特林
//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' 更改为
注释处理器 'android.arch.persistence.room:compiler:1.1.0'
就我而言,我更改了方案但忘记更改版本号。
@Database(entities = {Task1.class, Task2.class}, version = 2)
按照教程设置 Room 持久性库时,我 运行 在 Android 设备上测试时遇到此错误。
java.lang.RuntimeException:找不到 PackageName.AppDatabase 的实现。 AppDatabase_Impl不存在
我知道有人问过类似的问题,但这些问题是由于 kotlin gradle 问题引起的。
测试class:
@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 "android.arch.persistence.room:compiler:VERSION"
与 :
kapt "android.arch.persistence.room:compiler:VERSION"
您必须将注释处理器依赖项添加到您的 AppDatabase 所在的模块。我假设该应用程序将从我的 API 库模块中获取依赖项,我的数据模型 类 所在的模块,但显然情况并非如此。
答案来自这个 google 问题:
https://issuetracker.google.com/issues/67520422
而这个 SO 答案:
使用 Kotlin 的经验法则:
将您的 annotationProcessor
依赖项替换为 kapt
。此外,在您应用的 build.gradle
.
apply plugin: 'kotlin-kapt'
与
有同样的问题- 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 中写入数据库 entities/DAOs 和数据库。
对于科特林
//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' 更改为 注释处理器 'android.arch.persistence.room:compiler:1.1.0'
就我而言,我更改了方案但忘记更改版本号。
@Database(entities = {Task1.class, Task2.class}, version = 2)