Rxjava:插入仅适用于单个但不适用于可完成的

问题描述

所以我有两个用于插入新用户的 DAO 函数

@Insert(onConflict = OnConflictStrategy.REPLACE)
Completable addData(User user);

@Insert(onConflict = OnConflictStrategy.REPLACE)
Single<Long> insert(User user);

区别在于一个函数返回一个 completable,另一个函数返回一个 Single<Long>,其中 Long 等于新插入用户的 id。

对应的viewmodel函数

public Completable addData(User modelClass) {
    return Completable.fromAction(() -> appDatabase.userDao().addData(modelClass))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());
}

public Single<Long> addData2(User user) {
    return appDatabase.userDao().insert(user)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());
}

最后但并非最不重要的是我的 android 活动中的订阅方法

viewmodel.addData(new User( ""+myEntireName.getText().toString(),"jlk"))
.subscribe(
() -> { 
 Toast.makeText(this,"Jähgermeister!!!!!",Toast.LENGTH_LONG).show();
},throwable -> {
Toast.makeText(this,"Error!" + throwable.getMessage(),Toast.LENGTH_SHORT).show();
});

viewmodel.addData2(new User( ""+myEntireName.getText().toString(),"jlk"))
.subscribe(
newI -> { //onSucess
Toast.makeText(this,"Yeah i work: " + newI,//onError
throwable -> {
Toast.makeText(this,Toast.LENGTH_SHORT).show();
});

所以这里是问题:返回 Completable 的 Insert 函数打印 Toast 消息,但用户实际上不是 insertet。但是,如果我使用返回 Single<Long>函数,则会插入用户删除也是一样。

可能是什么原因?插入只能与 Single<Long> 一起使用吗?

解决方法

这一行是问题的根源:

return Completable.fromAction(() -> appDatabase.userDao().addData(modelClass))

appDatabase.userDao().addData() 返回一个 Completable。将它放在 fromAction() 中意味着您不会订阅它返回的 Completable,这意味着它应该做的任何工作实际上都不会发生。您需要改用 Completable.defer(() -> ...) 之类的东西,它实际上会订阅 Completable 调用返回的 addData