我有两个 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活动中,subscribe方法如下:
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();
});
所遇到的问题是:返回
Completable
的插入函数会打印 Toast 消息,但实际上用户并没有被插入。但如果使用返回 Single<Long>
的函数,则用户会被插入。删除也是同样的情况。可能的原因是什么?插入只能使用
Single<Long>
吗?
defer
只是让 Dao 的addData
方法在Completable
被订阅之前不会被调用。如果你在addData
内部进行的操作不是延迟(lazy),那么你通常只需要这个。如果addData
是延迟的,那么你可以完全省略defer
调用。 - dano