android – 使用sqlite开始使用RxJava

我正在学习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;
    }
}

以下是我尝试使用主要活动中的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能够使用Callables,但显然该函数不存在.快速googled显示.fromCallable应该通过像Async.fromCallable()这样的东西来使用,但由于我对RxJava很新,我只能理解如何根据the tutorial显示的方式创建可调用的…

抱歉我对RxJava的极端虚无

最佳答案
我确信会有其他一些意见,但到目前为止,我采取了几种不同的方法:

>如果你想要一个相对少量的数据(并且你可以保证它的大小总是有一个已知的上限),那么:

>创建一个访问数据库的同步方法,获取游标,迭代游标以创建包含数据的数据结构(例如List),然后返回它.
>创建一个调用该方法的Callable
>使用rx.fromCallable创建一个Observable

>如果需要无限数量的行,请执行与上面类似的操作,但返回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());
}

转载注明原文:android – 使用sqlite开始使用RxJava - 代码日志