SQLBrite库

来源:互联网 发布:方维生鲜o2o源码 编辑:程序博客网 时间:2024/06/03 06:28

SQLBrite库


介绍:

SQLBrite是一个围绕SQLiteOpenHelper和ContentResolver的轻量级包装器,它将reactive stream引入SQL操作。

类似CursorLoaders,使用SQLBrite来加载数据库中数据,当db中数据发生改变时,它将重新加载数据。

数据源发生改变到获取最新数据的过程:

  1. 将数据源通过SQLBrite插入数据库中

  2. SQLBrite将被通知,它将重新加载活动中的数据。

注意点: 目前,SQLBrite仅支持RxJava1.x,而不支持RxJava2.x

Usage(使用):

在gradle中配置:

compile 'com.squareup.sqlbrite:sqlbrite:1.1.1'

1. 创建对象:

创建SqlBrite对象:

SqlBrite sqlBrite = new SqlBrite.Builder().build();

通过SQLiteOpenHelper对象和Scheduler对象来创建BriteDatabase对象:

BriteDatabase db = sqlBrite.wrapDatabaseHelper(openHelper, Schedulers.io());

注意点:查询通知的触发是运行在(由RxJava提供的)Scheduler所在的线程中,以防止阻塞主线程或者触发器的线程。

2. 查询:

BriteDatabase.createQuery()与SQLiteDatabase.rawQuery类似,多了一个table(s)参数,用于监听table(s)的改变。

Observable<Query> users = db.createQuery("users", "SELECT * FROM users");users.subscribe(new Action1<Query>() {  @Override public void call(Query query) {    //当一个Subscribe订阅了,Query会立刻运行,最终返回一个Cursor。    Cursor cursor = query.run();    // TODO 根据Cursor对象 解析数据  }});

注意点:与传统的rawQuery不同,只要您长时间保持订阅Observable,更新指定table(s)的同时将会触发而外的通知。这意味着,插入,更新或者删除指定表中的数据时,任何Subscribe的查询会立即获取到新数据。

3. 插入:

插入,更新,删除操作都必须通过BriteDatabase对象来操作,才能正确通知到Subscribers.

//一个线程安全的加减的类final AtomicInteger queries = new AtomicInteger();users.subscribe(new Action1<Query>() {  @Override public void call(Query query) {    //每次调用一下,自增1    queries.getAndIncrement();  }});System.out.println("Queries: " + queries.get()); // Prints打印结果为: 1//这里插入三次,通知了订阅者三次,即getAndIncrement()被调用了三次,自增了3db.insert("users", createUser("jw", "Jake Wharton"));db.insert("users", createUser("mattp", "Matt Precious"));db.insert("users", createUser("strong", "Alec Strong"));System.out.println("Queries: " + queries.get()); // Prints打印结果为: 4

通过Subscription.unsubscribe()取消订阅,已停止获取最新的数据。

//一个线程安全的加减的类final AtomicInteger queries = new AtomicInteger();Subscription s = users.subscribe(new Action1<Query>() {  @Override public void call(Query query) {    queries.getAndIncrement();  }});System.out.println("Queries: " + queries.get()); // Prints打印结果为: 1//这里插入了2次,通知订阅者2次,即getAndIncrement()被调用了2次,自增了2db.insert("users", createUser("jw", "Jake Wharton"));db.insert("users", createUser("mattp", "Matt Precious"));//取消订阅后,后期数据源的改变,将接受不到。s.unsubscribe();//再插入一次,订阅者已经接受不到,即getAndIncrement()不会被调用。db.insert("users", createUser("strong", "Alec Strong"));System.out.println("Queries: " + queries.get()); // Prints打印结果为: 3

4. 事务:

使用Transactions来操作大量数据,防止重复通知Subscribers.

//一个线程安全的加减的类final AtomicInteger queries = new AtomicInteger();users.subscribe(new Action1<Query>() {  @Override public void call(Query query) {    queries.getAndIncrement();  }});System.out.println("Queries: " + queries.get()); // Prints打印结果为: 1//开启事务来插入多条数据,防止频繁通知订阅者。Transaction transaction = db.newTransaction();try {  db.insert("users", createUser("jw", "Jake Wharton"));  db.insert("users", createUser("mattp", "Matt Precious"));  db.insert("users", createUser("strong", "Alec Strong"));    //事务成功  transaction.markSuccessful();} finally {  //事务结束  transaction.end();}System.out.println("Queries: " + queries.get()); // Prints打印结果: 2

5. 与Rxjava结合使用:

由于查询返回的是Rxjaava中Observable对象。因此,操作符也可以用于控制通知Subscribers的频率

users.debounce(500, MILLISECONDS).subscribe(new Action1<Query>() {  @Override public void call(Query query) {    // TODO...  }});

SqlBrite对象包装一个ContentResolver,用于观察另外一个App的内容提供者的查询。

BriteContentResolver resolver = sqlBrite.wrapContentProvider(contentResolver, Schedulers.io());Observable<Query> query = resolver.createQuery(/*...*/);

RxJava的操作符是可用于组合,过滤,触发任意数量的查询和数据改变。

Philosophy:

  1. SqlBrite的唯一职责是协调和撰写(当表中数据源发生改变发出的)更新通知,以便于查询到最新数据。

  2. 这个库不是ORM,它不是类型安全查询机制。它不会序列话您用于Gson的同一POJO。它不会执行数据库迁移。

  3. 其中一些功能由SQLDelight提供,可与SQLBrite一起使用。

资源参考

  • SQLBrite介绍:https://github.com/square/sqlbrite
0 0
原创粉丝点击