如何在RxJava Observable中更新数据库?
我正在运行一个Android/Java程序来模拟一个运动队赛季,因此我有团队对象。我有一个模型类,用于通过ContentResolver/ContentProvider与数据库通信 我使用RxJava在Schedulers.io线程上与数据库通信,这样就不会阻塞主线程 在我的“InsertTeam”方法中,我能够很好地插入数据库。但是,在我的“UpdateTam”方法中,observable/subscription没有运行,我的数据库也没有更新(即调用了该方法,但observable没有运行-什么都没有发生)。如何在RxJava Observable中更新数据库?,java,android,multithreading,rx-java,observable,Java,Android,Multithreading,Rx Java,Observable,我正在运行一个Android/Java程序来模拟一个运动队赛季,因此我有团队对象。我有一个模型类,用于通过ContentResolver/ContentProvider与数据库通信 我使用RxJava在Schedulers.io线程上与数据库通信,这样就不会阻塞主线程 在我的“InsertTeam”方法中,我能够很好地插入数据库。但是,在我的“UpdateTam”方法中,observable/subscription没有运行,我的数据库也没有更新(即调用了该方法,但observable没有运行-
但是,如果我在AndroidSchedulers.mainThread()上运行UpdateTam observable,那么它可以工作(但会减慢我的程序) 这对我来说毫无意义。有人知道为什么我的update observable可以在主线程上工作,而不能在Schedulers.io线程上工作吗 InsertTeamMethod
@Override
public void insertTeam(final Team team) {
//Insert a team into the database
Observable<Uri> insertTeamObservable = Observable.fromCallable(new Callable<Uri>() {
@Override
public Uri call() throws Exception {
String name = team.getName();
double elo = team.getELO();
double offRating = team.getOffRating();
double defRating = team.getDefRating();
int currentWins = team.getWins();
int currentLosses = team.getLosses();
int currentDraws = team.getDraws();
int division = team.getDivision();
ContentValues values = new ContentValues();
values.put(TeamEntry.COLUMN_TEAM_NAME, name);
values.put(TeamEntry.COLUMN_TEAM_ELO, elo);
values.put(TeamEntry.COLUMN_TEAM_OFF_RATING, offRating);
values.put(TeamEntry.COLUMN_TEAM_DEF_RATING, defRating);
values.put(TeamEntry.COLUMN_TEAM_CURRENT_WINS, currentWins);
values.put(TeamEntry.COLUMN_TEAM_CURRENT_LOSSES, currentLosses);
values.put(TeamEntry.COLUMN_TEAM_CURRENT_DRAWS, currentDraws);
values.put(TeamEntry.COLUMN_TEAM_DIVISION, division);
//Insert values into database
Uri uri = contentResolver.insert(TeamEntry.CONTENT_URI, values);
return uri;
}
});
insertTeamObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Uri>() {
@Override
public void onSubscribe(Disposable d) {
mCompositeDisposable.add(d);
}
@Override
public void onNext(Uri uri) {
team.setUri(uri);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
@覆盖
public void insertTeam(最终团队){
//将团队插入数据库
Observable insertTeamObservable=Observable.fromCallable(newCallable()){
@凌驾
公共Uri调用()引发异常{
字符串名称=team.getName();
double-elo=team.getELO();
double offRating=team.getOffRating();
double defRating=team.getDefRating();
int currentWins=team.getWins();
int currentloss=team.getloss();
int currentDraws=team.getDraws();
int division=team.getDivision();
ContentValues=新的ContentValues();
value.put(TeamEntry.COLUMN\u TEAM\u NAME,NAME);
value.put(TeamEntry.COLUMN\u TEAM\u ELO,ELO);
值。放置(TeamEntry.COLUMN\u TEAM\u OFF\u RATING,offRating);
值.put(TeamEntry.COLUMN_TEAM_DEF_RATING,碎片整理);
value.put(TeamEntry.COLUMN\u TEAM\u CURRENT\u WINS,currentWins);
价值.投入(TeamEntry.COLUMN\团队\当前\损失,当前损失);
value.put(TeamEntry.COLUMN\u TEAM\u CURRENT\u DRAWS,currentDraws);
值。放置(TeamEntry.COLUMN\u TEAM\u DIVISION,DIVISION);
//将值插入数据库
Uri=contentResolver.insert(TeamEntry.CONTENT\u Uri,值);
返回uri;
}
});
insertTeamObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer()){
@凌驾
认购的公共无效(一次性d){
mCompositeDisposable.add(d);
}
@凌驾
public void onNext(Uri){
setUri(uri);
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
未完成的公共空间(){
}
});
}
updateAmmethod
@Override
public void updateTeam(final Team team) {
//Update a team in the database
Log.d("Before team obs", "" + team.getName());
Observable<Integer> updateTeamObservable = Observable.fromCallable(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
//Update team database wins, losses and win loss pct values
ContentValues values = new ContentValues();
values.put(TeamEntry.COLUMN_TEAM_CURRENT_WINS, team.getWins());
values.put(TeamEntry.COLUMN_TEAM_CURRENT_LOSSES, team.getLosses());
values.put(TeamEntry.COLUMN_TEAM_CURRENT_DRAWS, team.getDraws());
values.put(TeamEntry.COLUMN_TEAM_WIN_LOSS_PCT, team.getWinLossPct());
int rowsUpdated = contentResolver.update(team.getUri(), values, null, null);
Log.d("Team updated: ", "" + team.getName());
return rowsUpdated;
}
});
updateTeamObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
mCompositeDisposable.add(d);
}
@Override
public void onNext(Integer rowsUpdated) {
Log.d("Team rows updated: ", " " + rowsUpdated);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
@覆盖
public void updatetam(最终团队){
//更新数据库中的团队
Log.d(“在团队obs之前,”“+team.getName());
Observable UpdateAmobbservable=Observable.fromCallable(newCallable()){
@凌驾
公共整数调用()引发异常{
//更新团队数据库赢家、输家和赢家-输家pct值
ContentValues=新的ContentValues();
value.put(TeamEntry.COLUMN_TEAM_CURRENT_WINS,TEAM.getWins());
value.put(TeamEntry.COLUMN_TEAM_CURRENT_loss,TEAM.getloss());
value.put(TeamEntry.COLUMN\u TEAM\u CURRENT\u DRAWS,TEAM.getDraws());
value.put(TeamEntry.COLUMN_TEAM_WIN_LOSS_PCT,TEAM.getWinLossPct());
int rowsUpdated=contentResolver.update(team.getUri(),value,null,null);
Log.d(“团队更新:”,“+Team.getName());
返回原始数据;
}
});
updateTamobservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer()){
@凌驾
认购的公共无效(一次性d){
mCompositeDisposable.add(d);
}
@凌驾
public void onNext(整数行){
Log.d(“团队行更新:”、“+rowsUpdated”);
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
未完成的公共空间(){
}
});
}
它可能抛出了一个错误。请尝试在onError
中添加日志语句。谢谢,它确实抛出了一个错误“java.lang.NullPointerException:uri”。我更新的团队在插入数据库之前不会有Uri。我认为我的程序试图同时调用insert/update方法,所以有时uri是空的。我需要重新构造我的方法调用。我解决这个问题的方法是在insert方法中使用Observable.fromIterable()。在Observable中调用ObservatorOnComplete方法之前,我不会在代码中调用updateTeam方法。