【问题标题】:Android Room throws error: Deletion methods must either return void or return int (the number of deleted rows)Android Room 抛出错误:删除方法必须要么返回 void 要么返回 int(删除的行数)
【发布时间】:2019-01-01 21:05:57
【问题描述】:

我正在使用带有 RxJava 的 Android Room

dependencies {
    implementation 'androidx.room:room-rxjava2:2.1.0-alpha02'
}

我需要从参数化删除方法中获取 Completable,我认为这个功能是从 2.1.0 开始添加的?例如。

  @Query("DELETE FROM message_table WHERE uid = :id")
  Completable delete(String id);

  @Query("DELETE FROM message_table")
  Completable deleteAll();

仍然抛出错误:Deletion methods must either return void or return int (the number of deleted rows).

【问题讨论】:

  • 发行说明有:“额外的 Rx 返回类型支持:使用 @Insert、@Delete 或 @Update 注释的 DAO 方法现在支持 Rx 返回类型 Completable、Single 和 Maybe”。不过,@Query 中没有提到 DELETE
  • 我认为你不能像这样使用它,你需要像这样Single.fromCallable 回调创建它并使deleteAll 返回int

标签: android rx-java2 android-room


【解决方案1】:

正如错误消息试图说明的那样:

使用@Query,您必须将返回的数据类型从Completable 更改为intvoid

Completable 需要订阅另一个方法,该方法运行Dao 的方法:

Completable
  .fromAction(aMethodWhichCallsDao)
  .subscribeOn(Schedulers.single())
  .subscribe();

或者使用@Delete 注释,正如@Commonsware 所建议的那样(以防它像宣传的那样工作)。

【讨论】:

    【解决方案2】:

    我不知道你是否还需要这个,但今天刚进入同样的事情,发现你需要使用所有这 3 个库来创建 DAO 方法以返回 Completable:

    implementation 'androidx.room:room-runtime:2.2.1'
    kapt 'androidx.room:room-compiler:2.2.1'
    implementation 'androidx.room:room-rxjava2:2.2.1'
    

    希望对你有帮助。

    【讨论】:

    • 如果room-rxjava2 2.2.1 stable 解决了这个问题,这应该是问题的当前答案。它是提供绑定的库,所以它可能知道Completable
    • @MartinZeitler 它知道,我昨天刚做的。他们更新了图书馆。我首先使用了您的回复,然后我看到库上有更新并且我看到它有效。这就是我添加评论的原因。谢谢你的回答:)
    • 是的,当我收到此错误时,我首先查看的是我的 build.gradle 项目文件。
    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多