用room(rxjava)执行删除

Muh*_*lib 8 android rx-android rx-java2 android-room

在室内,@Delete注释不会发出任何东西.这就是它的dao样子

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

}
Run Code Online (Sandbox Code Playgroud)

这使得在做类似事情时出现问题

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

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

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


            }, this::handleError);
Run Code Online (Sandbox Code Playgroud)

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

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

但是,当我把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);
Run Code Online (Sandbox Code Playgroud)

我奇怪地得到这个例外:

cannot access database on the main thread since it may potentially lock the UI for a long period of time.
Run Code Online (Sandbox Code Playgroud)

小智 6

基于来自此问题的信息:在后台运行Void方法(StackOverflow)

使用Completable并订阅另一个线程,如下所示:

Completable.fromAction(this::clearCachedData)
   .subscribeOn(Schedulers.io())
   .subscribe();
Run Code Online (Sandbox Code Playgroud)

为我工作。clearCachedData方法在我正在调用的Room中执行查询。

我的查询是:

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


Ank*_*mar -1

@Query("DELETE FROM User.TABLE_NAME")
public void nukeTable();

@Query("DELETE FROM " + User.TABLE_NAME + " WHERE " + User.COLUMN_ID + " = :id")
int deleteById(long id);
Run Code Online (Sandbox Code Playgroud)

这些方法可能有用。