用room(rxjava)执行删除

时间:2017-12-21 08:55:33

标签: android rx-java2 rx-android android-room

在室内,@Delete注释不会发出任何内容。这就是dao的样子

@Dao
public interface UserDao {
    @Delete
    void deleteUser(User user);
    //We can't use Maybe or Single or anything here

}

这使得在执行

之类的操作时出现问题

userRepository.deleteUser().subscribeOn因为dao没有排放。我使用以下代码在后台线程上调用deleteUser。

Observable.just(appDatabase).
            subscribeOn(SchedulerProvider.getInstance().computation()).

            subscribe(db -> {
                userRepository.logoutUser(loggedUser.getLoggedInUser());
                loggedUser.setLoggedInUser(null);


            }, this::handleError);

这很好用。但是,在订阅方法中,我现在需要访问Android UI以显示宣布成功删除的Toast。当然,我得到这个例外(因为链中缺少observeOn)

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

然而,当我把observeOn像这样

Observable.just(appDatabase).
        subscribeOn(SchedulerProvider.getInstance().computation()).
        observeOn(SchedulerProvider.getInstance().ui()).
        subscribe(db -> {
            userRepository.logoutUser(loggedUser.getLoggedInUser());
            loggedUser.setLoggedInUser(null);

            Message message = new Message(R.string.user_logged_out_msg);
            message.setMessageType(Message.MessageType.SUCCESS_MESSAGE);
            view.showMessages(Arrays.asList(message)); //this leads to a taost

        }, this::handleError);

我奇怪地得到了这个例外:

cannot access database on the main thread since it may potentially lock the UI for a long period of time.

4 个答案:

答案 0 :(得分:3)

基于以下问题的信息:Run Void Method in Backgound (StackOverflow)

使用Completable并订阅另一个线程,如下所示: Completable.fromAction(this::clearCachedData).subscribeOn(Schedulers.single()).subscribe();为我工作。 clearCachedData方法在我正在呼叫的Room中执行查询。

我的查询是:

/**
 * Delete all data in the items table.
 */
@Query("DELETE FROM items")
void deleteWeatherItems();

答案 1 :(得分:2)

我知道这已经很晚了。但我遇到了同样的问题,并能够通过以下

来解决它

在Dao班

@Query("DELETE FROM users")
    fun deleteAllUser()

这样称呼它。这样您就可以订阅,它将在后台运行。

Single.fromCallable {
        user.deleteAllUser() //User Dao fun
    }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(..do stuff..)

答案 2 :(得分:0)

将Observable 只是方法替换为创建

  Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(@io.reactivex.annotations.NonNull ObservableEmitter<Object> e) throws Exception {
                e.onNext(tileDatabase.getCategoryDeo().deleteCategory(category));

            }
        })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Object>() {
                    @Override
                    public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {
                    }

                    @Override
                    public void onNext(@io.reactivex.annotations.NonNull Object o) {
                        Toast.makeText(MainActivity.this, "Record deleted ", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onError(@io.reactivex.annotations.NonNull Throwable e) {
                    }

                    @Override
                    public void onComplete() {
                    }
                });

答案 3 :(得分:-1)

FormBuilder

这些方法可能很有用。