Android Room: 'NoSuchMethodError: No interface method' for Dao methods that update, with Room.inMemoryDatabaseBuilder
Android Room: 'NoSuchMethodError: No interface method' for Dao methods that update, with Room.inMemoryDatabaseBuilder
我在 Android 上使用 Room。所以我的数据模型 class 带有适当的 Room 注释和单个 public 构造函数。它使用构建器模式并尝试成为 immutable。这是here.
然后我得到了我的 @Dao
注释接口,在所有方法声明旁边都有 @Query
、@Update
和 @Insert
注释,这是应该的。就在 here.
上方
最后,我得到了我的 Dao 测试 class,它使用 Room.inMemoryDatabaseBuilder
。是here.
所以当我 运行 GoalsDaoTest 中的测试时,它们都通过了,除了两个:一个使用带注释的 Dao 方法 @Update
,另一个其 Dao 方法使用 SQL UPDATE
命令在其 @Query
.
中
这是我的测试设置和拆卸,使用 Room.inMemoryDatabaseBuilder
:
@Before
public void initDb() {
mDatabase = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getContext(),
SelfCareDatabase.class).build();
}
@After
public void closeDb() {
mDatabase.close();
}
这是第一个失败的测试:
@Test
public void updateArchivedAndGetById() {
// When inserting a goal
mDatabase.goalDao().insertGoal(GOAL);
// When the goal is updated
mDatabase.goalDao().updateArchived(GOAL.getId(), true);
// When getting the goal by id from the database
Goal loaded = mDatabase.goalDao().getGoalById(ID);
// The loaded data contains the expected values
assertGoal(loaded, GOAL.getId(), GOAL.getTitle(), GOAL.getInterval(), GOAL.getPolarity(), true, GOAL.getTouched());
}
这是我 运行 它产生的错误:
java.lang.NoSuchMethodError: No interface method updateArchived(Ljava/lang/String;Z)V in class Lcom/beatboxchad/android/selfcaredashboard/data/source/local/GoalsDao; or its super classes (declaration of 'com.beatboxchad.android.selfcaredashboard.data.source.local.GoalsDao' appears in /data/app/com.beatboxchad.android.selfcaredashboard-1/base.apk)
at com.beatboxchad.android.selfcaredashboard.data.source.local.GoalsDaoTest.updateArchivedAndGetById(GoalsDaoTest.java:155)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at android.support.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
at android.support.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=12=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=12=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:58)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1939)
然而,该方法已在 GoalsDao 中正确声明和注释 class:
/**
* Update the Archived status of a goal
*
* @param goalId id of the goal
* @param archived status to be updated
*/
@Query("UPDATE goals SET archived = :archived WHERE entryid = :goalId")
void updateArchived(String goalId, boolean archived);
这是另一个测试:
@Test
public void updateGoalAndGetById() {
// When inserting a goal
mDatabase.goalDao().insertGoal(GOAL);
// When the goal is updated
Goal updatedGoal = new Goal.Builder(ID)
.setTitle(TITLE2)
.setPolarity(POLARITY2)
.setInterval(INTERVAL2)
.setArchived(ARCHIVED2)
.setTouched(TOUCHED2)
.build();
mDatabase.goalDao().updateGoal(updatedGoal);
// When getting the goal by id from the database
Goal loaded = mDatabase.goalDao().getGoalById(ID);
// The loaded data contains the expected values
assertGoal(loaded, ID, TITLE2, INTERVAL2, POLARITY2, ARCHIVED2, TOUCHED2);
}
这是它的错误:
java.lang.NoSuchMethodError: No interface method updateGoal(Lcom/beatboxchad/android/selfcaredashboard/data/Goal;)I in class Lcom/beatboxchad/android/selfcaredashboard/data/source/local/GoalsDao; or its super classes (declaration of 'com.beatboxchad.android.selfcaredashboard.data.source.local.GoalsDao' appears in /data/app/com.beatboxchad.android.selfcaredashboard-1/base.apk)
at com.beatboxchad.android.selfcaredashboard.data.source.local.GoalsDaoTest.updateGoalAndGetById(GoalsDaoTest.java:140)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at android.support.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
at android.support.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=15=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=15=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:58)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1939)
还有!把我弄糊涂了!是什么疯狂导致计算机撒谎? GoalsDao.java 摘录:
/**
* Update a goal.
*
* @param goal goal to be updated
* @return the number of goals updated. This should always be 1.
*/
@Update
int updateGoal(Goal goal);
我已经用尽了这个上所有容易实现的成果。一切似乎都符合文档(尽管我怀疑我的 immutable builder'd Goal class),并且我尝试遵循以下地方给出的建议:
但我既没有使用 Kotlin 也没有使用 @Relation
注释,即使我在我的 build.gradle 文件中使用了各种不同的版本,它仍然存在问题。好的一面是,我从那个无聊的部分学到了很多东西。 tl;博士我很难过。
为了防止上下文有帮助,我的应用强烈基于 https://github.com/googlesamples/android-architecture 中的 todo‑mvvm‑databinding 示例。我提到这一点是因为示例中的一切都有效,但我增加了一些复杂性并且可能犯了一些更有经验的人会认识到的错误。特别是,我破坏了 @Entity
目标 class(示例应用程序中的任务),试图保持它不变 table 并添加构建器模式和几个属性。我也没有完成对它的破坏——感动即将成为它自己的 table。
我也不擅长对将接口和一堆注释转换为代码的任何问题进行故障排除。关于在何处寻找解决此问题的任何建议与其将导致的答案一样有用。我是 Android Studio、Java 和整个构建过程的新手。
谢谢!
使缓存无效并在 android studio 中重新启动
我在 Android 上使用 Room。所以我的数据模型 class 带有适当的 Room 注释和单个 public 构造函数。它使用构建器模式并尝试成为 immutable。这是here.
然后我得到了我的 @Dao
注释接口,在所有方法声明旁边都有 @Query
、@Update
和 @Insert
注释,这是应该的。就在 here.
最后,我得到了我的 Dao 测试 class,它使用 Room.inMemoryDatabaseBuilder
。是here.
所以当我 运行 GoalsDaoTest 中的测试时,它们都通过了,除了两个:一个使用带注释的 Dao 方法 @Update
,另一个其 Dao 方法使用 SQL UPDATE
命令在其 @Query
.
这是我的测试设置和拆卸,使用 Room.inMemoryDatabaseBuilder
:
@Before
public void initDb() {
mDatabase = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getContext(),
SelfCareDatabase.class).build();
}
@After
public void closeDb() {
mDatabase.close();
}
这是第一个失败的测试:
@Test
public void updateArchivedAndGetById() {
// When inserting a goal
mDatabase.goalDao().insertGoal(GOAL);
// When the goal is updated
mDatabase.goalDao().updateArchived(GOAL.getId(), true);
// When getting the goal by id from the database
Goal loaded = mDatabase.goalDao().getGoalById(ID);
// The loaded data contains the expected values
assertGoal(loaded, GOAL.getId(), GOAL.getTitle(), GOAL.getInterval(), GOAL.getPolarity(), true, GOAL.getTouched());
}
这是我 运行 它产生的错误:
java.lang.NoSuchMethodError: No interface method updateArchived(Ljava/lang/String;Z)V in class Lcom/beatboxchad/android/selfcaredashboard/data/source/local/GoalsDao; or its super classes (declaration of 'com.beatboxchad.android.selfcaredashboard.data.source.local.GoalsDao' appears in /data/app/com.beatboxchad.android.selfcaredashboard-1/base.apk)
at com.beatboxchad.android.selfcaredashboard.data.source.local.GoalsDaoTest.updateArchivedAndGetById(GoalsDaoTest.java:155)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at android.support.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
at android.support.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=12=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=12=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:58)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1939)
然而,该方法已在 GoalsDao 中正确声明和注释 class:
/**
* Update the Archived status of a goal
*
* @param goalId id of the goal
* @param archived status to be updated
*/
@Query("UPDATE goals SET archived = :archived WHERE entryid = :goalId")
void updateArchived(String goalId, boolean archived);
这是另一个测试:
@Test
public void updateGoalAndGetById() {
// When inserting a goal
mDatabase.goalDao().insertGoal(GOAL);
// When the goal is updated
Goal updatedGoal = new Goal.Builder(ID)
.setTitle(TITLE2)
.setPolarity(POLARITY2)
.setInterval(INTERVAL2)
.setArchived(ARCHIVED2)
.setTouched(TOUCHED2)
.build();
mDatabase.goalDao().updateGoal(updatedGoal);
// When getting the goal by id from the database
Goal loaded = mDatabase.goalDao().getGoalById(ID);
// The loaded data contains the expected values
assertGoal(loaded, ID, TITLE2, INTERVAL2, POLARITY2, ARCHIVED2, TOUCHED2);
}
这是它的错误:
java.lang.NoSuchMethodError: No interface method updateGoal(Lcom/beatboxchad/android/selfcaredashboard/data/Goal;)I in class Lcom/beatboxchad/android/selfcaredashboard/data/source/local/GoalsDao; or its super classes (declaration of 'com.beatboxchad.android.selfcaredashboard.data.source.local.GoalsDao' appears in /data/app/com.beatboxchad.android.selfcaredashboard-1/base.apk)
at com.beatboxchad.android.selfcaredashboard.data.source.local.GoalsDaoTest.updateGoalAndGetById(GoalsDaoTest.java:140)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at android.support.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
at android.support.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=15=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=15=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:58)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1939)
还有!把我弄糊涂了!是什么疯狂导致计算机撒谎? GoalsDao.java 摘录:
/**
* Update a goal.
*
* @param goal goal to be updated
* @return the number of goals updated. This should always be 1.
*/
@Update
int updateGoal(Goal goal);
我已经用尽了这个上所有容易实现的成果。一切似乎都符合文档(尽管我怀疑我的 immutable builder'd Goal class),并且我尝试遵循以下地方给出的建议:
但我既没有使用 Kotlin 也没有使用 @Relation
注释,即使我在我的 build.gradle 文件中使用了各种不同的版本,它仍然存在问题。好的一面是,我从那个无聊的部分学到了很多东西。 tl;博士我很难过。
为了防止上下文有帮助,我的应用强烈基于 https://github.com/googlesamples/android-architecture 中的 todo‑mvvm‑databinding 示例。我提到这一点是因为示例中的一切都有效,但我增加了一些复杂性并且可能犯了一些更有经验的人会认识到的错误。特别是,我破坏了 @Entity
目标 class(示例应用程序中的任务),试图保持它不变 table 并添加构建器模式和几个属性。我也没有完成对它的破坏——感动即将成为它自己的 table。
我也不擅长对将接口和一堆注释转换为代码的任何问题进行故障排除。关于在何处寻找解决此问题的任何建议与其将导致的答案一样有用。我是 Android Studio、Java 和整个构建过程的新手。
谢谢!
使缓存无效并在 android studio 中重新启动