调用 Rooms inMemoryBuilder 方法时,Room Persistence Library 运行时异常
Posted
技术标签:
【中文标题】调用 Rooms inMemoryBuilder 方法时,Room Persistence Library 运行时异常【英文标题】:Room Persistence Library run time exception when calling Rooms inMemoryBuilder method 【发布时间】:2017-11-09 01:43:21 【问题描述】:按照教程设置 Room 持久性库时,我在 android 设备上进行测试时遇到了这个错误。
java.lang.RuntimeException:找不到 PackageName.AppDatabase 的实现。 AppDatabase_Impl 不存在
我知道有人问过类似的问题,但问题是由于 kotlin gradle 问题造成的。 Possible Duplicate
测试类:
@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)
分级:
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"
【问题讨论】:
是否只在测试中抛出错误?还是在开发中。? @Moinkhan 对两者都抛出相同的错误 AppDatabase 的包是什么? 【参考方案1】:我在我的 gradle 文件中将“annotationProcessor”关键字更改为“kapt”。像这样:
kapt "android.arch.persistence.room:compiler:1.0.0"
【讨论】:
这里有同样的问题。这解决了它。不过,回到已弃用的注释处理器并不是最佳选择。 这并没有为我解决 - 我已经在使用 annotationProcessorapply plugin: 'kotlin-kapt'
是必须的!即使您的构建在不添加它的情况下工作,添加它也会使注释处理器的行为有所不同(例如,不重命名 SQL 占位符所需的参数)
之后别忘了清理你的项目。
我在更改为 kapt 时与 Glide 发生冲突。我该如何解决?【参考方案2】:
使用 Kotlin 时的经验法则:
用kapt
替换您的annotationProcessor
依赖项。另外,在您的应用的build.gradle
中包含apply plugin: 'kotlin-kapt'
。
【讨论】:
谢谢 - 正如你所说的kapt "android.arch.persistence.room:compiler:$archRoomVersion"
而不是 'annotationProcessor' 完成这项工作【参考方案3】:
看看this thread
解决办法是更换:
annotationProcessor "android.arch.persistence.room:compiler:VERSION"
与:
kapt "android.arch.persistence.room:compiler:VERSION"
【讨论】:
【参考方案4】:您必须将注释处理器依赖项添加到您的 AppDatabase 所在的模块。我假设该应用程序会从我的数据模型类所在的 API 库模块中获取依赖性,但显然情况并非如此。
答案来自这个谷歌问题: https://issuetracker.google.com/issues/67520422 而这个答案: https://***.com/a/43918701/1959110
【讨论】:
【参考方案5】:遇到同样的问题
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 实体/DAO 和数据库。
【讨论】:
【参考方案6】:就我而言,我有更改方案但忘记更改版本号。
@Database(entities = Task1.class, Task2.class, version = 2)
【讨论】:
【参考方案7】:对于科特林
//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'
【讨论】:
【参考方案8】:将 annotationProcessor 从 annotationProcessor 'android.arch.persistence.room:runtime:1.1.0' 更改为 annotationProcessor 'android.arch.persistence.room:compiler:1.1.0'
【讨论】:
要将其变成一个好的答案,您应该添加更多信息。为什么这能解决问题?以上是关于调用 Rooms inMemoryBuilder 方法时,Room Persistence Library 运行时异常的主要内容,如果未能解决你的问题,请参考以下文章