开始使用 RxJava 和 sqlite

2024-02-11

我正在学习 RxJava,并且已经阅读了几篇文章和视频。我对 RxJava 所提供的功能感到非常敬畏,所以我认为目前已经了解了响应式编程的全部内容。Dan Lew 的本教程 http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/帮助我在一定程度上了解了使用 RxJava 的基础知识。但我发现,我越认为自己已经完全理解了 RxJava,我的脑海中就会冒出越多的问题。

由于我是一个在编写代码时学到最多的人,因此这就是我正在尝试做的事情。我已经有一个使用 SQLite 的应用程序。我的应用程序有 7 个饼图,它从数据库游标获取数据。每个饼图从光标处获取不同行的数据(浮点值),并根据其数据生成图表。

我现在想做的是,我想使用 RxJava 从数据库中检索数据并填充图表。但我不知道 RxJava 应该如何与数据库交互。我需要使用任何额外的库来执行此操作吗?因为我发现rxjava-jdbc https://github.com/davidmoten/rxjava-jdbc and SqlBrite https://corner.squareup.com/2015/02/sqlbrite-reactive-sqlite-for-android.html我认为这应该对我有帮助,但我真的需要它们吗?我还找到了一个SO 中的问题 https://stackoverflow.com/questions/30075663/flatten-observableobservablecursor-to-observablecursor它似乎没有使用任何额外的库(当然除了 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 应该这样做..但实际上如何做到这一点?根据本教程展示了如何使用 Observable.from http://blog.danlew.net/2014/09/22/grokking-rxjava-part-2/,所以我希望能够通过执行 Observable.fromCallable 来使用 Callables,但显然该函数不存在。快速谷歌搜索表明 .fromCallable 应该通过执行类似 Async.fromCallable() 之类的操作来使用,但由于我对 RxJava 很陌生,所以我只能了解如何根据如何创建可调用教程 http://blog.danlew.net/2014/09/22/grokking-rxjava-part-2/显示...

对于我对 RxJava 的极度不懂,深表歉意


我确信还会有很多其他意见,但到目前为止,我已经采取了几种不同的方法:

  • 如果您想要相对少量的数据(并且您可以保证它始终具有已知的大小上限),那么:

    • 创建一个同步方法来访问数据库,获取游标,迭代游标以创建包含数据的数据结构(例如列表),然后返回它。
    • 创建一个调用该方法的 Callable
    • 使用 rx.fromCallable 创建一个 Observable
  • 如果您需要无限数量的行,请执行与上述类似的操作,但返回游标。

编辑:示例代码:

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());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开始使用 RxJava 和 sqlite 的相关文章

随机推荐

  • 数组的地址与第一个元素的地址不同?

    据我所知数组的地址a是该数组的第一个元素的地址 void func int a cout lt lt address in func lt lt a lt lt endl cout lt lt GT lt lt a 0 lt lt endl
  • Rails:rspec 中 url 帮助程序的主机名错误

    Url 帮助程序 例如 root url 在应用程序控制器与 rspec 示例中返回不同的主机名 我已经成功地在我的 Rails 应用程序中设置了 url 助手的域 如下所示 class ApplicationController lt A
  • 导入 Windows Live 联系人

    我已经开始从实时导入联系人 现在我不知道微软在想什么 但他们真的把他们所做的一切都搞得太复杂了 对于我的应用程序来说 获取电话号码非常重要 事实上 非常重要的是 如果您没有电话号码 您的联系方式将被跳过 用我的方法我看不到任何电话号码 我以
  • 在内核空间中存储结构体数组,Linux

    我相信我可能有点过度思考这个问题 我的文件系统上有一个文本文件 我在启动时解析该文件并将结果存储到结构数组中 我需要将此数组从用户空间复制到内核空间 copy from user 并且必须让内核随时可以访问此数据 内核空间中的数据需要通过
  • 环境错误:Gmsh 版本必须 >= 2.0

    我是 fipy 的新手 所以如果我问一些应该显而易见的问题 请原谅我的无知 但我无法运行已经存在的 并且在其他机器上工作的 脚本 无法获取EnvironmentError Gmsh version must be gt 2 0 我可能在安装
  • 使用 exec 中的动态 SQL - exec 终止所有用户会话

    环境 SQL Server 2005 2008 我想使用动态 SQL 终止特定数据库上的所有用户连接 我知道其他方法 例如将数据库模式更改为单一 离线等 但希望使用动态 SQL 我试图避免游标 while 循环以及在执行动态 SQL 时使用
  • Julia 中“检测到包的要求无法满足”

    我在向 Julia 添加包时遇到错误 Error 数据框 v1 5 pkg gt add DataFrames Updating registry at C Users julia registries JuliaComputingRegi
  • C99 printf 中的可变前导零

    我正在用 C99 编写一个多精度库 根据编译代码的平台 我选择不同的表示基础 因此 举例来说 假设在平台 X 上系统选择 BASE 100 并且在平台上Y BASE 10000 假设我代表大无符号整数 如下所示 typedef struct
  • 如何测量用于 .NET 远程处理的 IP 端口输入/输出的字节数?

    我正在使用 NET 远程处理将定期状态更新从 Windows 服务检索到 控制器 应用程序中 该应用程序用于显示有关服务正在执行的操作的一些实时统计信息 由此产生的网络流量非常巨大 是更新数据大小的很多倍 所以很明显 我以一种非常低效的方式
  • 无法弄清楚这个“被调用的对象不是函数”C 时间错误

    因此 对于我的学校作业的一部分 我需要找到当前时间 我用它作为参考 http www cplusplus com reference ctime localtime http www cplusplus com reference ctim
  • 在 Less 中连接字符串

    我认为这是不可能的 但我想我问是否有办法 我的想法是 我有一个用于 Web 资源文件夹路径的变量 root img file test css url root file px background image url url 我得到这个结
  • 以编程方式调节 Windows 7 计算机上的音量

    我想知道是否可以使 Tkinter 比例与计算机的音量相对应 换句话说 通过拖动比例尺 电脑的音量会不会变大 这只是我编写的一些随机代码 我正在运行 64 位 Windows 7 操作系统 1 from Tkinter import 2 3
  • constexpr 数组成员是编译时常量吗?

    是代码片段 struct Parameters static constexpr int n 2 static constexpr double v n 4 0 5 0 合法的 C 11 如果是的话 是Parameters v 0 and
  • 使用 ANTLR 解析循环

    我想使用 ANTLR 解析一个简单的类似 matlab 的 for 循环 循环就像 for i 1 8 y i a i i end 我想解析循环并解析8次y i a i i语句 以便对每个语句执行一些操作 我的规则如下 操作在 C 中描述
  • 有没有办法冻结 ES6 Map?

    我正在寻找一种冻结原生 ES6 地图的方法 Object freeze https developer mozilla org en US docs Web JavaScript Reference Global Objects Objec
  • Swift - 交付应用程序上的本地通知图标徽章编号更新在后台

    我试图弄清楚如何在传递本地通知时动态更新图标徽章编号 在安排时注册徽章号码不是一个选项 因为如果我在发送任何通知之前注册两个或多个通知 UIApplication shared applicationIconBadgeNumber this
  • web.config 文件何时“执行”?

    每次加载网站上的页面时 服务器都会执行 读取它吗 创建应用程序时 web config 会加载到内存中 这通常是对应用程序中页面 资源的第一个请求 IIS ASP NET 监视 web config 的更改 如果发生更改 将重新启动您的应用
  • 如何在 ggplot 背景(而不是面板)上添加图像?

    如何使用图像作为 ggplot2 绘图的背景 例如 代码 mtcars gt ggplot aes cyl geom bar theme plot background element rect fill black It results
  • 如何为 rsync SSH 命令自动传递密码?

    我需要去做rsync by ssh并希望自动执行此操作 而无需传递密码ssh手动 使用 sshpass 非交互式 ssh 密码提供程序实用程序 在Ubuntu上 sudo apt get install sshpass rsync 命令 u
  • 开始使用 RxJava 和 sqlite

    我正在学习 RxJava 并且已经阅读了几篇文章和视频 我对 RxJava 所提供的功能感到非常敬畏 所以我认为目前已经了解了响应式编程的全部内容 Dan Lew 的本教程 http blog danlew net 2014 09 15 g