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
所以我有两个用于插入新用户的 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