Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在RxJava Observable中更新数据库?_Java_Android_Multithreading_Rx Java_Observable - Fatal编程技术网

如何在RxJava 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没有运行-

我正在运行一个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方法。