当前位置:首页 > 开发教程 > 手机开发 >

SQLiteOpenHelper一个轻量级的封装包它引入了无流语义SQL操作

时间:2016-02-16 13:20 来源:互联网 作者:源码搜藏 收藏

SQLBrite 围绕一个轻量级封装 SQLiteOpenHelper 和 ContentResolver的 ,介绍无流语义查询。 用法 创建 SqlBrite 实例是用于库功能的适配器。 SqlBrite sqlBrite = SqlBrite . create(); 传递一个 SQLiteOpenHelper 实例来创建 BriteDatabase 。 BriteDataba

SQLBrite

围绕一个轻量级封装SQLiteOpenHelperContentResolver的,介绍无流语义查询。

用法

创建SqlBrite实例是用于库功能的适配器。


	
SqlBrite sqlBrite = SqlBrite.create();

传递一个SQLiteOpenHelper实例来创建BriteDatabase


	
BriteDatabase db = sqlBrite.wrapDatabaseHelper(openHelper);

BriteDatabase.createQuery方法类似于SQLiteDatabase.rawQuery除了它需要桌要监听更改的附加 参数。订阅返回 观测<查询>,将立即用通知查询运行。


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

不同于传统的rawQuery,更新到指定的表(S)将触发额外的通知,只要你继续订阅的观测。这意味着,当你插入,更新或删除数据,任何订阅查询将用新的数据即时更新。


	
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

db.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

在前面的例子中,我们重新使用的BriteDatabase为插入对象“DB”。安卓代码所有的插入,更新或删除操作必须以正确地通知用户去通过这个对象。

从返回取消订阅,停止获取更新。


	
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

db.insert("users", createUser("jw", "Jake Wharton"));
db.insert("users", createUser("mattp", "Matt Precious"));
s.unsubscribe();

db.insert("users", createUser("strong", "Alec Strong"));

System.out.println("Queries: " + queries.get()); // Prints 3

使用事务,以防止垃圾邮件从你的用户大数据的更改。


	
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

注意:您还可以使用try-带资源与交易实例。

因为查询是只是常规RxJava 观测对象,运营商也可以用来控制通知给用户的频率。


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

SqlBrite对象还可以换一个ContentResolver的观察上的另一个应用程序的内容提供商查询。


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

RxJava的运营商的全功率可用于混合,过滤,并触发任意数量的查询和数据的变化。

哲学

SqlBrite的唯一责任是要协调和撰写更新的通知表,这样你可以尽快更新查询数据的变化的机制。

这个库是不是一个ORM。它不是一个类型安全的查询机制。它不会序列化您使用GSON相同的POJO。它不会进行数据库迁移为您服务。

一天可能会其中一些功能被添加时,但它不是这一天。

下载

编译 com.squareup.sqlbrite:sqlbrite:0.5.1 ”

下载地址https://github.com/square/sqlbrite/archive/master.zip


手机开发阅读排行

最新文章