Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓机房:';NoSuchMethodError:没有接口方法';对于更新的Dao方法,请使用Room.inMemoryDatabaseBuilder_Java_Android_Junit4_Android Room - Fatal编程技术网

Java 安卓机房:';NoSuchMethodError:没有接口方法';对于更新的Dao方法,请使用Room.inMemoryDatabaseBuilder

Java 安卓机房:';NoSuchMethodError:没有接口方法';对于更新的Dao方法,请使用Room.inMemoryDatabaseBuilder,java,android,junit4,android-room,Java,Android,Junit4,Android Room,我正在使用Android上的Room。所以我得到了我的数据模型类,它带有适当的房间注释和一个公共构造函数。它使用构建器模式,并试图保持不变。它是 然后,我在所有方法声明旁边添加了带注释的接口,该接口带有@Query、@Update、和@Insert。马上 最后,我得到了我的Dao测试类,它使用Room.inMemoryDatabaseBuilder。是的 因此,当我在GoalsDaoTest中运行测试时,它们都通过了,除了两个:一个使用带注释的Dao方法@Update,另一个使用其Dao方法的@

我正在使用Android上的Room。所以我得到了我的数据模型类,它带有适当的房间注释和一个公共构造函数。它使用构建器模式,并试图保持不变。它是

然后,我在所有方法声明旁边添加了带注释的接口,该接口带有
@Query
@Update
、和
@Insert
。马上

最后,我得到了我的Dao测试类,它使用
Room.inMemoryDatabaseBuilder
。是的

因此,当我在GoalsDaoTest中运行测试时,它们都通过了,除了两个:一个使用带注释的Dao方法
@Update
,另一个使用其Dao方法的
@Query
中的SQL
Update
命令

这是我的测试设置和拆卸,使用
房间。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$1.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$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.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$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.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类中正确声明和注释:

/**
 * 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$1.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$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.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$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.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);
我已经把这件事上所有悬而未决的东西都吃光了。一切似乎都符合文档的要求(尽管我怀疑我的不可变构建器目标类),我尝试遵循以下地方给出的建议:

但是我没有使用Kotlin或
@Relation
注释,即使我在build.gradle文件中使用了各种不同的版本,它仍然是坏的。好的一面是,我学到了很多关于那个无聊的部分。tl;博士,我被难住了

为了以防万一,我的应用程序在很大程度上基于中的todo‑mvvm‑数据绑定示例。我之所以提到这一点,是因为样本中的一切都是有效的,但我增加了一些复杂性,并且可能在这一过程中犯了一个更有经验的人会认识到的错误。特别是,我破坏了
@Entity
目标类(示例应用程序中的任务),试图保持其不变,并添加了构建器模式和几个属性。我也没把它弄坏——Touch就要成为它自己的桌子了

我也不擅长解决将接口和一堆注释转换为代码的问题。任何关于解决这一问题的建议都和它所能得到的答案一样有用。我不熟悉Android Studio、Java和整个构建过程


谢谢大家!

在android studio中使缓存失效并重新启动有助于

只是为了确保,您是否已将
注释处理器
添加到build.gradle文件中?我添加了!事实上,我将kotlin依赖项添加到项目中,并将其改为
kapt
(我没有保留这些更改)。这可能已经修复了它,但它破坏了数据绑定(或者其他东西——我得到了关于绑定类的相同错误消息,该类由于各种问题而找不到——通常是布局文件中的语法错误),因此我根本无法运行任何测试,因为它无法编译。我没有明确地将
kapt
用于Room,将
annotationProcessor
用于数据绑定。不过,我不知道为
annotationProcessor
提供什么参数。