2017-02-27 7 views
1

私はAndroidプロジェクトで初めてrxjava2を使用しており、バックグラウンドスレッドでSQLクエリを実行しています。rxjava2を使用して単一のデータベース行を照会

しかし、単純なSQLクエリを実行し、レコードが存在する場合と存在しない場合を処理する最良の方法を考え出すのに問題があります。私が使用しているコードは次のとおりです。

public Observable<Record> createRecordObservable(int id) { 
    Callable<Record> callback = new Callable<Record>() { 
     @Override 
     public Record call() throws Exception { 
      // do the actual sql stuff, e.g. 
      // select * from Record where id = ? 
      return record; 
     } 
    }; 
    return Observable.fromCallable(callback).subscribeOn(Schedulers.computation()); 
} 

レコードが存在する場合はうまく動作します。しかし、idと一致するレコードが存在しない場合は、エラーのように扱います。明らかにこれは、rxjava2がCallableにnullを返すことを許可していないためです。

明らかに私はこれを本当に望んでいません。エラーは、データベースが失敗した場合や、何かが空である場合にのみ有効です。空の結果は完全に有効です。私はどこかで、可能な解決策の1つがJava 8でレコードをラップしていることを読んでいます。オプションですが、私のプロジェクトはJava 8ではありません。

これは確かに、私は確かにシンプルで簡単な解決策でなければならないと確信しているような一般的な、日常的な作業ですが、これまでのところ見つけられませんでした。ここで使用する推奨パターンは何ですか?

答えて

3

RxJava2の新しいObservableタイプMaybeのユースケースは、1または0のアイテムを放出します。
Maybe.fromCallableは、返されたnullを放出されたアイテムとして扱いません。

RxJava2でヌルに関する議論を見ることができますが、多くの選択肢はありませんが、null /空の値が必要な場合はOptionalと同じように使用されます。

0

@yosrizのおかげで、私はMaybeと協力しています。代わりに、観察可能なの

次のように多分使用します:私はコメントでコードを置くことができないので、私はここで完全な答えを投稿します良いことが返されたレコードがあることを許可されている

public Maybe<Record> lookupRecord(int id) { 
    Callable<Record> callback = new Callable<Record>() { 
     @Override 
     public Record call() throws Exception { 
      // do the actual sql stuff, e.g. 
      // select * from Record where id = ? 
      return record; 
     } 
    }; 
    return Maybe.fromCallable(callback).subscribeOn(Schedulers.computation()); 
} 

ヌル。加入者にどのような状況が発生したかを検出するには、コードは次のようになります。

lookupRecord(id) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new Consumer<Record>() { 
      @Override 
      public void accept(Record r) { 
       // record was loaded OK 

      } 
     }, new Consumer<Throwable>() { 
      @Override 
      public void accept(Throwable throwable) { 
       // there was an error 

      } 
     }, new Action() { 
      @Override 
      public void run() { 
       // there was an empty result 
      } 
     }); 
関連する問題