围绕一个轻量级封装SQLiteOpenHelper
和ContentResolver的
,介绍无流语义查询。
创建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
热门源码