问题描述
@Insert(onConflict = OnConflictStrategy.REPLACE)
Completable addData(User user);
@Insert(onConflict = OnConflictStrategy.REPLACE)
Single<Long> insert(User user);
区别在于一个函数返回一个 completable
,另一个函数返回一个 Single<Long>
,其中 Long
等于新插入用户的 id。
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
。