SQLBrite库
来源:互联网 发布:方维生鲜o2o源码 编辑:程序博客网 时间:2024/06/03 06:28
SQLBrite库
介绍:
SQLBrite是一个围绕SQLiteOpenHelper和ContentResolver的轻量级包装器,它将reactive stream引入SQL操作。
类似CursorLoaders,使用SQLBrite来加载数据库中数据,当db中数据发生改变时,它将重新加载数据。
数据源发生改变到获取最新数据的过程:
将数据源通过SQLBrite插入数据库中
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:
SqlBrite的唯一职责是协调和撰写(当表中数据源发生改变发出的)更新通知,以便于查询到最新数据。
这个库不是ORM,它不是类型安全查询机制。它不会序列话您用于Gson的同一POJO。它不会执行数据库迁移。
其中一些功能由SQLDelight提供,可与SQLBrite一起使用。
资源参考:
- SQLBrite介绍:https://github.com/square/sqlbrite
- SQLBrite库
- sqlbrite 响应式数据库(rx数据库)
- SQLBrite:一个响应式的数据查询框架
- Rxjava+数据库?来用用SqlBrite和SqlDelight吧!
- Android SqlBrite使用介绍和官方demo详解
- Android SqlDelight和SqlBrite无缝结合使用的Demo例子
- Retrofit+Rxjava+SqlBrite+SqlDelight实现多文件断点续传下载
- Android开发中RxJava-SQLBrite实时刷新UI
- Android MVP架构(RxJava+SQLBrite+Retrofit+OkHttp+Glide)
- RxAndroid之操作数据库SqlBrite(RXAndroid实现数据库的增、删、改、查)
- 一个响应式数据库框架SQLBrite,完美解决数据库和UI的同步更新!
- 一个响应式数据库框架SQLBrite,完美解决数据库和UI的同步更新!
- RxAndroid之操作数据库SqlBrite(RXAndroid实现数据库的增、删、改、查)
- 库
- 库
- 库
- 库
- 库
- Spring学习笔记之通过Spring和JDBC征服数据库
- scala数组的使用
- 求素数
- CTF自学网站
- Oracle 11.2.0.4 RAC修改SCAN IP
- SQLBrite库
- 商品展示
- 类和对象
- 算法的上帝——Donald E.Knuth(转)
- scala---文档主题生成模型(LDA)算法原理及Spark MLlib调用实例(Scala/Java/python)
- Python Road Day 1
- POJ1753
- 有关字符串的问题
- LDA主题模型评估方法--Perplexity