SQLBrite:一个响应式的数据查询框架

泡在网上的日子 / 文 发表于2015-03-06 10:27 次阅读 SQLBrite,Database

这篇文章是Square公司的技术文章,作者是Jake Wharton -译者注。

从一开始,安卓中数据的存储、查询、更新就一直没有变过。去年,我们为了满足一连串的需求,在分析了16个library之后,发现没有一个项目能达到我们的目的,因此决定着手编写自己的解决方法。

SQLite显然是复杂数据保存与查询的首选方案。经过设计与讨论之后,我们构建了一个简化应用SQLite操作的完整方案的原型。这个原型的特性包括诸如自动创建与迁移表格,行的对象映射、类型安全的查询,以及在数据变更时的通知。

当将之和Square Cash整合的时候,我们发现虽然这个原型的概念非常好,但是其实现有点笨重。因此几周前我们重构了代码,以达到在保留思想的同时,让结构也更合理。

SQLBrite是这次努力的第一个发行版本,后面的增量都将基于这个版本。 我们使用RxJava observables 的订阅模式来查询 ,而不是直接执行查询:

Observable<Query> users = db.createQuery("user", "SELECT * FROM user");
users.subscribe(new Action1<Query>() {
  @Override public void call(Query query) {
    Cursor cursor = query.run();
    // TODO parse data...
  }
});

我们不企图掩盖SQL,Cursor或者SQLiteOpenHelper的概念(这和contentprovider的思想完全相反)。而是将这三个概念赋予“数据更新的通知”。当一个表格的数据因为插入,修改,或者删除而变更时,该数据的订阅者将会随之变更。

final AtomicInteger count = new AtomicInteger();
users.subscribe(new Action1<Query>() {
  @Override public void call(Query query) {
    count.getAndIncrement();
  }
});
System.out.println("Queries: " + count.get()); // Prints 1

db.insert("user", createUser("jw", "Jake Wharton"));
db.insert("user", createUser("mattp", "Matt Precious"));
db.insert("user", createUser("strong", "Alec Strong"));

System.out.println("Queries: " + count.get()); // Prints 4

当多个操作不断的刷新数据时,UI会实时的更新,而不是静止不变。

sqlbrite.png

 SQLBrite的源码开放在GitHub的 github.com/square/sqlbrite 。在社区的共同努力下会越来越完善。


原文 SQLBrite: A Reactive Database Foundation

转载注明出处 http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0306/2552.html 

收藏 赞 (3) 踩 (1)
上一篇:在安卓上使用RxJava
如果你做过Android(和Java)的开发,很有可能已经听说过RxJava了。RxJava是由Netflix开发的响应式扩展(Reactive Extensions)的Java实现。引用 MSDN上对它的定义 ,Reactive Extensions是这样一个第三方库: 它结合了可观察集合和LINQ式查询以达到异步和基
下一篇:VectorDrawable – 第四章
前几篇文章中,我们知道了如何创建 VectorDrawable 以及制作path group的动画,也知道了如何渲染出路径的绘制效果。但是还有更多的动画方式,那就是修改SVG的path数据本身。这篇文章将讲解是如何做到的。 为了修改SVG的path数据,我们需要先了解一点SVG path