我正在学习RxJava,并浏览了几篇文章和视频。我完全感觉到RxJava可以提供的功能,因此我认为当前已经了解了Reactive Programming的全部含义。 This tutorial by Dan Lew帮助我了解了使用RxJava的基础知识。但是我发现,我以为自己对RxJava了如指掌,就会浮现出更多的问题。

由于我是编写代码时学习最多的人,所以这就是我想要做的。我已经有一个利用SQLite的应用程序。我的应用程序有7个饼图,可从数据库游标获取其数据。每个饼图都从光标获取不同的数据行(浮点值),并根据其数据生成图表。

我现在想做的是,我想使用RxJava从数据库中检索数据并填充图表。但是我对RxJava如何与数据库交互感到困惑。我是否需要使用任何其他库来做到这一点?因为我找到了rxjava-jdbcSqlBrite,我认为这应该对我有帮助,但是我真的需要它们吗?我还发现了question in SO,它似乎没有使用任何其他库(当然,除了RxJava以外),而且他似乎使用ContentObservable,但我仍然没有完全理解它。除了回答他的问题的那个人甚至都不使用ContentObservable。我只是知道Android有自己的Observable类..与RxJava一起使用是否完全兼容?如果没有,为什么要使用相同的名称?

有人请帮我...

================================================== ======

针对以下GreyBeardedGeek的解决方案:

这是我的Callable,可从sqlite检索数据

public class GetIncome implements Callable<Map<String,String>> {
    public static final String FILE_NAME = "CGetIncome";

    Context myContext;
    int year, month;

    public GetIncome(Context context, int getYear, int getMonth){
        myContext = context;
        year = getYear;
        month = getMonth;
    }

    @Override
    public Map<String,String> call() throws Exception {
        Map<String,String> output = new HashMap<>();
        JarControl jc = new JarControl(myContext);
        JSONObject getIncome = jc.getIncome(year,month,0,0);

        output.put("necessities",getIncome.getString("necessities"));
        output.put("savings",getIncome.getString("savings"));

        return output;
    }
}

这是我在主要 Activity 中尝试使用Callable的方式:
Callable<Map<String,String>> getIncome = new GetIncome(getContext(),2015,9);

现在,我不知道如何将getIncome可调用对象放入Observables中。您在rx中提到fromCallables应该这样做..但是实际上该怎么做?根据this tutorial that shows how to use Observable.from,因此我希望能够通过执行Observable.fromCallable来使用C​​allables,但显然该功能不存在。快速Google搜索表明.fromCallable应该通过执行Async.fromCallable()之类的方式使用,但是由于我对RxJava并不陌生,所以我只能根据the tutorial的显示方式来了解如何创建可调用对象...

对于我在RxJava上的极端笨拙感到抱歉

最佳答案

我敢肯定会有很多其他意见,但是到目前为止,我已经采取了两种不同的方法:

  • 如果您想要相对少量的数据(并且可以保证它始终具有已知的大小上限),则:
  • 创建访问数据库,获取游标,迭代游标以创建包含数据的数据结构(例如List),然后返回它的同步方法。
  • 创建一个调用方法
  • 的Callable
  • 使用rx.fromCallable创建一个可观察的
  • 如果您需要无限制的行数,请执行与上面类似的操作,但是返回Cursor。

  • 编辑:示例代码:
    private Map<String, String> getDataFromDatabase() {
       Map<String, String> result = new HashMap<>();
       // do whatever you need to (i.e. db query, cursor) to fill it in
       return result;
    }
    
    private Callable<Map<String, String>> getData() {
       return new Callable() {
          public Map<String, String> call() {
            return getDataFromDatabase();
        }
    }
    
    // in utility class  RxUtil.java
    public static <T> Observable<T> makeObservable(final Callable<T> func) {
            return Observable.create(
                    new Observable.OnSubscribe<T>() {
                        @Override
                        public void call(Subscriber<? super T> subscriber) {
                            try {
                                T observed = func.call();
                                if (observed != null) { // to make defaultIfEmpty work
                                    subscriber.onNext(observed);
                                }
                                subscriber.onCompleted();
                            } catch (Exception ex) {
                                subscriber.onError(ex);
                            }
                        }
                    });
        }
    
    
    // and finally,
    public Observable<Map<String, String>> getDataObservable() {
       return RxUtil.makeObservable(getData());
    }
    

    10-07 19:21
    查看更多