RxAndroid之操作数据库SqlBrite(RXAndroid实现数据库的增、删、改、查)

来源:互联网 发布:杭州sql培训班 编辑:程序博客网 时间:2024/06/05 12:04

一、查询

1.创建SqlBrite

[java] view plain copy
  1. SqlBrite sqlBrite = SqlBrite.create();  
2.将SQLiteOpenHelper的一个实例和一个Scheduler作为参数创建BriteDatabase,正确地传入Scheduler可以防止线程被阻塞
[java] view plain copy
  1. BriteDatabase db = sqlBrite.wrapDatabaseHelper(openHelper, Schedulers.io());  
3.通过BriteDatabase.createQuery方法来进行查询,它需要两个参数,一个是所要查询的表,一个是sql语句,这个方法与SQLiteDatabase.rawQuery类似Observable<Query> users = db.createQuery("users", "SELECT * FROM users");

4.通过返回的Observable来进行订阅,并通过query.run()方法获取数据

[java] view plain copy
  1. users.subscribe(new Action1<Query>() {  
  2.   @Override public void call(Query query) {  
  3.     Cursor cursor = query.run();  
  4.     // TODO parse data...  
  5.   }  
  6. });  

二、增加、删除、更新表后所有订阅的数据都会马上进行更新

所有的增、删、改、查操作都必须通过对象BriteDatabase来正确地通知订阅者
[java] view plain copy
  1. final AtomicInteger queries = new AtomicInteger();  
  2. users.subscribe(new Action1<Query>() {  
  3.   @Override public void call(Query query) {  
  4.     queries.getAndIncrement();  
  5.   }  
  6. });  
  7. System.out.println("Queries: " + queries.get()); // Prints 1  
  8.   
  9. db.insert("users", createUser("jw""Jake Wharton"));  
  10. db.insert("users", createUser("mattp""Matt Precious"));  
  11. db.insert("users", createUser("strong""Alec Strong"));  
  12.   
  13. 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.

[java] view plain copy
  1. final AtomicInteger queries = new AtomicInteger();  
  2. Subscription s = users.subscribe(new Action1<Query>() {  
  3.   @Override public void call(Query query) {  
  4.     queries.getAndIncrement();  
  5.   }  
  6. });  
  7. System.out.println("Queries: " + queries.get()); // Prints 1  
  8.   
  9. db.insert("users", createUser("jw""Jake Wharton"));  
  10. db.insert("users", createUser("mattp""Matt Precious"));  
  11. s.unsubscribe();  
  12.   
  13. db.insert("users", createUser("strong""Alec Strong"));  
  14.   
  15. System.out.println("Queries: " + queries.get()); // Prints 3  

四、数据改变较大时使用transactions
[java] view plain copy
  1. final AtomicInteger queries = new AtomicInteger();  
  2. users.subscribe(new Action1<Query>() {  
  3.   @Override public void call(Query query) {  
  4.     queries.getAndIncrement();  
  5.   }  
  6. });  
  7. System.out.println("Queries: " + queries.get()); // Prints 1  
  8.   
  9. Transaction transaction = db.newTransaction();  
  10. try {  
  11.   db.insert("users", createUser("jw""Jake Wharton"));  
  12.   db.insert("users", createUser("mattp""Matt Precious"));  
  13.   db.insert("users", createUser("strong""Alec Strong"));  
  14.   transaction.markSuccessful();  
  15. finally {  
  16.   transaction.end();  
  17. }  
  18.   
  19. System.out.println("Queries: " + queries.get()); // Prints 2  

五、使用操作符

queries只是普通的RxJava 的Observable对象,所有的操作符都可以用来控制所要发给订阅者的数据

[java] view plain copy
  1. users.debounce(500, MILLISECONDS).subscribe(new Action1<Query>() {  
  2.   @Override public void call(Query query) {  
  3.     // TODO...  
  4.   }  
  5. });  
六、监测从其它app查询的数据
[java] view plain copy
  1. BriteContentResolver resolver = sqlBrite.wrapContentProvider(contentResolver, Schedulers.io());  
  2. Observable<Query> query = resolver.createQuery(/*...*/);  

创建数据库和表的类:
[java] view plain copy
  1. public class RxDatabaseHelper extends SQLiteOpenHelper{  
  2.   
  3.     private String TAG = "RX";  
  4.     private  Context context;  
  5.   
  6.     private static RxDatabaseHelper rxDatabaseHelper = null;  
  7.   
  8.     private RxDatabaseHelper(Context context) {  
  9.         super(context, "rxdb.sqlite"null1);                         //创建数据库rxdb.sqlite  
  10.         this.context = context;  
  11.     }  
  12.   
  13.     public static RxDatabaseHelper getInstance(Context context){  
  14.         if(rxDatabaseHelper == null){  
  15.             synchronized (RxDatabaseHelper.class){  
  16.                 if(rxDatabaseHelper == null){  
  17.                     rxDatabaseHelper = new RxDatabaseHelper(context);  
  18.                 }  
  19.             }  
  20.         }  
  21.         return rxDatabaseHelper;  
  22.     }  
  23.   
  24.     @Override  
  25.     public void onCreate(SQLiteDatabase db) {  
  26.         //创建表rx_db_test,表中的字段:_id,name,gender,age  
  27.         db.execSQL("create table if not exists rx_db_test (_id integer primary key,name text, gender text, age long)");  
  28.     }  
  29.   
  30.     @Override  
  31.     public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {  
  32.   
  33.     }  

测试增删改查的类:
[java] view plain copy
  1. public class RxDatabaseActivity extends Activity{  
  2.   
  3.     private String TAG = "RX";  
  4.   
  5.     private RxDatabaseHelper rxDatabaseHelper;  
  6.     private SQLiteOpenHelper sqLiteOpenHelper;  
  7.     private SQLiteDatabase sqLiteDatabase;  
  8.   
  9.     private BriteDatabase briteDatabase;  
  10.     private SqlBrite sqlBrite;  
  11.   
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.rx_widget_layout);  
  16.   
  17.         sqLiteOpenHelper = RxDatabaseHelper.getInstance(getApplicationContext());  
  18.         sqLiteDatabase = sqLiteOpenHelper.getWritableDatabase();  
  19.         sqlBrite = SqlBrite.create();  
  20.         briteDatabase = sqlBrite.wrapDatabaseHelper(sqLiteOpenHelper,Schedulers.io());  
  21.   
  22. //        testInser();                      //增  
  23. //        testDelete();                     //删  
  24. //        testUpdate();                     //改  
  25.         testQuery();                       //查  
  26.     }  
  27.   
  28.   
  29.     //查询数据  
  30.     private void testQuery() {  
  31.         Observable<SqlBrite.Query> rxDbTest = briteDatabase.createQuery("rx_db_test""SELECT * FROM rx_db_test");  
  32.         rxDbTest.subscribe(new Action1<SqlBrite.Query>() {  
  33.             @Override  
  34.             public void call(SqlBrite.Query query) {  
  35.                 Cursor cursor = query.run();  
  36.                 while (cursor.moveToNext()){  
  37.                     Log.e(TAG,"["+cursor.getString(cursor.getColumnIndex("name"))+","+cursor.getString(cursor.getColumnIndex("gender"))+","  
  38.                     +cursor.getLong(cursor.getColumnIndex("age"))+"]");  
  39.                 }  
  40.             }  
  41.         });  
  42.   
  43.     }  
  44.   
  45.     //修改数据  
  46.     private void testUpdate() {  
  47.         ContentValues contentValues = new ContentValues();  
  48.         contentValues.put("age",10);  
  49.         //将姓名为zhangsan19的人的年龄改为10  
  50.         briteDatabase.update("rx_db_test",contentValues,"name=?","zhangsan19");  
  51.     }  
  52.   
  53.     //删除数据  
  54.     private void testDelete() {  
  55.         //删除age=10的那条数据  
  56.         //第一个参数是表名,第二个参数是所要匹配的字段的名字,第三个参数是所要匹配的字段值  
  57.         briteDatabase.delete("rx_db_test","age=?","10");  
  58.     }  
  59.   
  60.   
  61.     //添加数据  
  62.     private void testInser() {  
  63.         ContentValues contentValues = new ContentValues();  
  64.         //第一个参数是表名,第二个参数是所要添加的数据的键值对  
  65. //        db.execSQL("create table if not exists rx_db_test (_id integer primary key,name text, gender text, age long)");  
  66.        for(int i=1;i<20;i++){  
  67.            contentValues.put("name","zhangsan"+i);  
  68.            if(i%2 == 0) {  
  69.                contentValues.put("gender""女");  
  70.            }else{  
  71.                contentValues.put("gender""男");  
  72.            }  
  73.            contentValues.put("age", i);  
  74.            briteDatabase.insert("rx_db_test", contentValues);  
  75.        }  
  76.   
  77.     }  
  78. }  

增加数据运行结果:



删除数据运行结果(将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


阅读全文
0 0
原创粉丝点击