【问题标题】:Room Rxjava Single as Delete ResponseRoom Rxjava Single 作为删除响应
【发布时间】:2018-11-26 11:36:06
【问题描述】:

我遇到了一些来自 Room Library 的编译时错误问题。

我正在使用版本:2.1.0-alpha02

以下道导致错误:

@Dao()
public interface WorkoutExerciseDao {

    [......]
    @Update()
    Single<Integer> updateWorkout(final WorkoutExercise... workoutExercises);


    @Delete
    Single<Integer> deleteWorkouts(final WorkoutExercise... user);

    @Query("DELETE FROM workout_exercise_table WHERE id  IN(:exerciseIds)")
    Single<Integer> deleteWorkouts(final long... exerciseIds);
}

目前第一个@Delete 注释方法可以正常编译并按预期工作。如果我添加第二个(在查询方法中删除)它会破坏编译并出现错误:

删除方法必须返回 void 或返回 int( 删除的行)。

我错过了什么吗?

【问题讨论】:

  • 这里是单一的@Delete-annotated 方法。 “第二”是什么意思?
  • 我指的是包含 DELETE 语句的查询。抱歉,应该更清楚一点
  • 我认为 Room 的 RxJava 代码生成不够智能,无法将 @QueryDELETE 方法适配到 Single&lt;Integer&gt;。您是否尝试将其更改为intInteger
  • 只是想知道当我返回 Single 时删除注释方法发生了同样的错误。所以它似乎确实能够为 Delete 方法映射那些
  • 是的,似乎并没有期望LongShortByte

标签: android android-room


【解决方案1】:

你是对的,我遇到了这个问题。我不知道原因,但我知道在最新版本的空间中没有任何方法可以处理这个问题,当您使用 DELETE 的查询时,它说返回类型必须是 void 或 int 但如果您想使用 RX对于DELETE 查询,您可以这样做,但可能不是最好的方法: 首先将interface 转换为abstract class 并将所有方法转换为abstract method 然后

@Dao
public abstract class WorkoutExerciseDao {

    @Update()
    abstract Single<Integer> updateWorkout(final WorkoutExercise... workoutExercises);

    @Delete
    abstract Single<Integer> deleteWorkouts(final WorkoutExercise... user);

    @Query("DELETE FROM workout_exercise_table WHERE id  IN(:exerciseIds)")
    abstract Integer deleteWorkouts(final long... exerciseIds);

    Single<Integer> deleteWorkoutsById(final long... exerciseIds) {
        return Single.create(emitter -> {
            emitter.onSuccess(deleteWorkouts(exerciseIds));
        });
    }
}

【讨论】:

  • 谢谢。与此同时,我正在做这样的事情作为一种解决方法。我在官方跟踪器中提交了一个错误报告,它得到了提升。也许这会在非 beta/alpha 版本发布时得到解决。
【解决方案2】:
@Query("DELETE FROM yourDB")
void delete() : Completable

【讨论】:

  • 你能补充一些解释吗?
【解决方案3】:

您需要使用AndroidX

将您的项目迁移到 AndroidX 首先参考documentation,简单的方法是右键单击您的项目文件夹,确保它在 projects 透视图中,右键单击文件夹并点击Refactor,应该会有一个选项“Migrate to AndroidX”。

将项目迁移到 AndroidX 后,您现在可以在应用级 gradle 中添加 AndroidX 依赖项。

implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" // kapt for Kotlin
// optional - RxJava support for Room
implementation "androidx.room:room-rxjava2:$room_version"

请参阅documentation 以添加 Room 的最新版本依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多