一、查询
1.创建SqlBrite
- SqlBrite sqlBrite = SqlBrite.create();
- BriteDatabase db = sqlBrite.wrapDatabaseHelper(openHelper, Schedulers.io());
4.通过返回的Observable来进行订阅,并通过query.run()方法获取数据
- users.subscribe(new Action1<Query>() {
- @Override public void call(Query query) {
- Cursor cursor = query.run();
- // TODO parse data...
- }
- });
二、增加、删除、更新表后所有订阅的数据都会马上进行更新
所有的增、删、改、查操作都必须通过对象BriteDatabase来正确地通知订阅者
- 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
三、
Unsubscribe from the returned
Subscription
to stop getting updates.
Unsubscribe from the returned Subscription
to stop getting updates.
- 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
四、数据改变较大时使用transactions
- 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
五、使用操作符
queries只是普通的RxJava 的Observable对象,所有的操作符都可以用来控制所要发给订阅者的数据
- users.debounce(500, MILLISECONDS).subscribe(new Action1<Query>() {
- @Override public void call(Query query) {
- // TODO...
- }
- });
六、监测从其它app查询的数据
- BriteContentResolver resolver = sqlBrite.wrapContentProvider(contentResolver, Schedulers.io());
- Observable<Query> query = resolver.createQuery(/*...*/);
创建数据库和表的类:
- public class RxDatabaseHelper extends SQLiteOpenHelper{
- private String TAG = "RX";
- private Context context;
- private static RxDatabaseHelper rxDatabaseHelper = null;
- private RxDatabaseHelper(Context context) {
- super(context, "rxdb.sqlite", null, 1); //创建数据库rxdb.sqlite
- this.context = context;
- }
- public static RxDatabaseHelper getInstance(Context context){
- if(rxDatabaseHelper == null){
- synchronized (RxDatabaseHelper.class){
- if(rxDatabaseHelper == null){
- rxDatabaseHelper = new RxDatabaseHelper(context);
- }
- }
- }
- return rxDatabaseHelper;
- }
- @Override
- public void onCreate(SQLiteDatabase db) {
- //创建表rx_db_test,表中的字段:_id,name,gender,age
- db.execSQL("create table if not exists rx_db_test (_id integer primary key,name text, gender text, age long)");
- }
- @Override
- public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
- }
测试增删改查的类:
- public class RxDatabaseActivity extends Activity{
- private String TAG = "RX";
- private RxDatabaseHelper rxDatabaseHelper;
- private SQLiteOpenHelper sqLiteOpenHelper;
- private SQLiteDatabase sqLiteDatabase;
- private BriteDatabase briteDatabase;
- private SqlBrite sqlBrite;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.rx_widget_layout);
- sqLiteOpenHelper = RxDatabaseHelper.getInstance(getApplicationContext());
- sqLiteDatabase = sqLiteOpenHelper.getWritableDatabase();
- sqlBrite = SqlBrite.create();
- briteDatabase = sqlBrite.wrapDatabaseHelper(sqLiteOpenHelper,Schedulers.io());
- // testInser(); //增
- // testDelete(); //删
- // testUpdate(); //改
- testQuery(); //查
- }
- //查询数据
- private void testQuery() {
- Observable<SqlBrite.Query> rxDbTest = briteDatabase.createQuery("rx_db_test", "SELECT * FROM rx_db_test");
- rxDbTest.subscribe(new Action1<SqlBrite.Query>() {
- @Override
- public void call(SqlBrite.Query query) {
- Cursor cursor = query.run();
- while (cursor.moveToNext()){
- Log.e(TAG,"["+cursor.getString(cursor.getColumnIndex("name"))+","+cursor.getString(cursor.getColumnIndex("gender"))+","
- +cursor.getLong(cursor.getColumnIndex("age"))+"]");
- }
- }
- });
- }
- //修改数据
- private void testUpdate() {
- ContentValues contentValues = new ContentValues();
- contentValues.put("age",10);
- //将姓名为zhangsan19的人的年龄改为10
- briteDatabase.update("rx_db_test",contentValues,"name=?","zhangsan19");
- }
- //删除数据
- private void testDelete() {
- //删除age=10的那条数据
- //第一个参数是表名,第二个参数是所要匹配的字段的名字,第三个参数是所要匹配的字段值
- briteDatabase.delete("rx_db_test","age=?","10");
- }
- //添加数据
- private void testInser() {
- ContentValues contentValues = new ContentValues();
- //第一个参数是表名,第二个参数是所要添加的数据的键值对
- // db.execSQL("create table if not exists rx_db_test (_id integer primary key,name text, gender text, age long)");
- for(int i=1;i<20;i++){
- contentValues.put("name","zhangsan"+i);
- if(i%2 == 0) {
- contentValues.put("gender", "女");
- }else{
- contentValues.put("gender", "男");
- }
- contentValues.put("age", i);
- briteDatabase.insert("rx_db_test", contentValues);
- }
- }
- }
增加数据运行结果:
删除数据运行结果(将age=10的那条数据删除了):
修改数据后运行的结果(将姓名为zhangsan19的人的年龄改为10):
查询运行的结果:
注:1.需要在build.gradle中添加compile 'com.squareup.sqlbrite:sqlbrite:0.7.0'
2.参考资料:https://github.com/ReactiveX/RxAndroid/wiki#removed
https://github.com/square/sqlbrite