SqlBrite 源码解析

作者: rain 分类: 移动 发布时间: 2016-05-20 23:55 6 条评论

在介绍 SqlBrite 如何使用的时候提到 SqlBrite 只是一个轻量级的封装,所以代码量很少,通过分析 SqlBrite 的代码可以学习到普通的应用场景如何支持 RxJava。

SqlBrite 支持对数据库访问和 ContentProvider 访问的封装,所以核心类只有 BriteDatabase 和 BriteContentResolver 这两个,其他的几个类都是一些辅助功能。而 BriteContentResolver 和 BriteDatabase 相比功能就更加简单,所以这里我们只讨论 BriteDatabase 相关的代码,BriteContentResolver 相关的读者可以自行查看。

SqlBrite.java

SqlBrite 这个类是一个入口类,主要用来创建封装后的 BriteDatabase 对象的,在创建 SqlBrite 的时候需要用到 create 函数,可以选择一个 Logger 对象来显示 sql 语句调试信息:

然后就可以创建一个数据库的封装对象:

另外 SqlBrite 类中还有一个 Query 抽象类,该类主要有一个功能,用来实现执行 sql 语句并返回 Cursor 查询结果的功能,这个函数为抽象函数:

另外还有一个 asRows 函数用来把 Cursor 封装为一个 Observable ,可以使用 Observable 来处理 Cursor 里面的数据:

另外该类还提供了几个静态辅助函数用来把 Cursor 对象映射为一个对象或者一个对象列表:

Query 类一般用在事务处理中,在一个事务中,你无法创建新的查询,只能使用 BriteDatabase 的 query 函数来拿到一个 Cursor 对象,然后用 Query 类来封装这个对象。

在把 Cursor 映射到 Java 对象和对象列表的时候,使用到了另外两个自定义的操作函数: QueryToOneOperatorQueryToListOperator

QueryToOneOperator.java

QueryToOneOperator 操作函数是把一个 Cursor 中的一行数据映射为对应的 Java 对象,具体的映射关系需要你自己提供:

QueryToListOperator.java

而 QueryToListOperator 和 QueryToOneOperator 是类似的,区别只是把获取到的 Java 对象放到一个 List 中一起发射。

QueryObservable.java

QueryObservable 这个类只是对 Observable 做了一个封装,提供了前面几个常用的操作函数在 Observable 上的实现,这样在使用 SqlBrite 的时候代码写起来更简洁:

完全可以不用这个类,直接使用 lift 和 Query 提供的静态辅助函数在 Observable 上操作也能实现一样的功能。

BriteDatabase.java

而最后就是这个比较重要的 BriteDatabase 类了。

不太容易理解的地方就是 createQuery 函数内对 Observable 一串操作函数串联调用的地方。可以参考 RxJava 中操作函数的文档说明仔细揣摩揣摩。

本文出自 云在千峰,转载时请注明出处及相应链接。

本文永久链接: http://blog.chengyunfeng.com/?p=991

Ɣ回顶部