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

Rxjava: Insert only works with single but not with completable

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

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

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

不同的是,一个函数returns一个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 activity:

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, Toast.LENGTH_LONG).show();
}, //onError
throwable -> {
Toast.makeText(this, "Error!" + throwable.getMessage(), Toast.LENGTH_SHORT).show();
});

所以这里是问题所在:Insert 函数 returns a Completable 打印 Toast 消息但用户实际上不是 insertet。但是,如果我使用 returns a Single<Long> 插入用户的功能。删除也是如此。

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

这一行是问题的根源:

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

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

的调用返回的 Completable