一個響應式數據庫框架SQLBrite,完美解決數據庫和UI的同步更新!

轉載優秀博文: http://blog.csdn.net/u012702547/article/details/52577403


相信小夥伴們在開發中或多或少都可能遇到過這樣的問題:打開一個應用後,爲了快速響應,先將數據庫中的數據呈現給用戶,然後再去網絡上請求數據,請求成功之後將數據緩存至數據庫,同時更新UI,但是我們經常會這樣想,可不可以我只將數據緩存至數據庫,當數據庫中的數據發生改變時,UI會自動更新?這個當然可以實現,我們今天就來看看square公司推出的一個響應式數據庫框架SQLBrite。

1.準備工作

SQLBrite項目地址:https://github.com/square/sqlbrite

將SQLBrite引入到我們的項目中:

[java] view plain copy
 print?
  1. compile 'com.squareup.sqlbrite:sqlbrite:0.7.0'   

在處理線程問題時,由於要使用到RxAndorid中相關的類,所以我們還要引入RxAndroid:

[java] view plain copy
 print?
  1. compile 'io.reactivex:rxandroid:1.1.0'  

另外:

SQLBrite的使用基於RxJava的使用,如果小夥伴們對RxJava的使用尚不熟悉,請移步這裏RxAndroid結合Retrofit,看看誰纔是最佳拍檔!


2.開始使用

和以前一樣,講解代碼之前我們先來看看效果圖:


大家看到,當我添加數據時ListView會自動更新,刪除數據或者修改數據時ListView一樣會自動更新,就是這麼簡單一個效果,我們來看看實現方式。

2.1創建DBHelper

首先我們需要創建一個DBHelper,由於SQLBrite只是對數據的增刪改查過程重新做了封裝,其他的以前怎麼寫現在還是怎麼寫。DBHelper的創建和我們Sqlite中DBHelper的創建方式一模一樣,假設我創建一個User表,如下:

[java] view plain copy
 print?
  1. public class DBHelper extends SQLiteOpenHelper {  
  2.   
  3.     private static final String DBNAME = "sang.db";  
  4.     private static final int CURRENTVERSION = 1;  
  5.     public static final String USERTABLE = "usertable";  
  6.   
  7.     public DBHelper(Context context) {  
  8.         super(context, DBNAME, null, CURRENTVERSION);  
  9.     }  
  10.   
  11.     @Override  
  12.     public void onCreate(SQLiteDatabase db) {  
  13.         db.execSQL("CREATE TABLE IF NOT EXISTS " + USERTABLE + "(_id INTEGER PRIMARY KEY AUTOINCREMENT,USERNAME,NICKNAME);");  
  14.     }  
  15.   
  16.     @Override  
  17.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  18.   
  19.     }  
  20. }  

2.2初始化數據庫,獲取db對象

獲取db對象只要三行代碼,如下:

[java] view plain copy
 print?
  1. SqlBrite sqlBrite = SqlBrite.create();  
  2.         DBHelper dbHelper = new DBHelper(this);  
  3.         db = sqlBrite.wrapDatabaseHelper(dbHelper, AndroidSchedulers.mainThread());  

第一步先是獲取一個SqlBrite對象,這個通過create方法直接獲取即可,然後創建一個DBHelper的實例,最後通過sqlBrite類中的wrapDatabaseHelper方法來獲取一個db實例,第一個參數不必說,第二個參數表示數據庫的操作是在哪一個線程中進行的,AndroidSchedulers.mainThread()方法表示數據庫的操作在主線程中執行。獲取的db對象之後,後面的增刪改查操作我們都要在這個db對象中進行。

2.3添加數據

[java] view plain copy
 print?
  1. ContentValues values = new ContentValues();  
  2.         values.put("USERNAME""ZHANGSAN");  
  3.         values.put("NICKNAME""張三");  
  4.         long insert = db.insert(DBHelper.USERTABLE, values);  

第一個參數表示要操作的表名,第二個參數表示要插入的數據。

2.4刪除數據

[java] view plain copy
 print?
  1. db.delete(DBHelper.USERTABLE, "_id < ?"new String[]{5 + ""});  

這裏的參數都很簡單,不多說。

2.5修改數據

[java] view plain copy
 print?
  1. ContentValues values = new ContentValues();  
  2.         values.put("USERNAME""LISI");  
  3.         db.update(DBHelper.USERTABLE, values, "_id < ? and _id > ?"new String[]{20 + ""10 + ""});  

2.6查詢數據

[java] view plain copy
 print?
  1. QueryObservable query = db.createQuery(DBHelper.USERTABLE, "SELECT * FROM " + DBHelper.USERTABLE, null);  
  2.         query.subscribe(new Action1<SqlBrite.Query>() {  
  3.             @Override  
  4.             public void call(SqlBrite.Query query) {  
  5.                 Cursor cursor = query.run();  
  6.                 List<String> list = new ArrayList<String>();  
  7.                 while (cursor.moveToNext()) {  
  8.                     String username = cursor.getString(cursor.getColumnIndex("USERNAME"));  
  9.                     String id = cursor.getString(cursor.getColumnIndex("_id"));  
  10.                     String nickname = cursor.getString(cursor.getColumnIndex("NICKNAME"));  
  11.                     list.add(id + "--" + username + "--" + nickname);  
  12.                 }  
  13.                 cursor.close();  
  14.                 ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, list);  
  15.                 lv.setAdapter(adapter);  
  16.             }  
  17.         });  

SQLBrite中可以直接通過SQL語句來查詢數據,拿到Cursor對象之後剩下的就好說了。


2.7事務的使用

大批量進行數據插入操作的時候,我們可以使用事務,使用方式如下:

[java] view plain copy
 print?
  1. BriteDatabase.Transaction transaction = db.newTransaction();  
  2.         try {  
  3.             ContentValues values = new ContentValues();  
  4.             values.put("USERNAME""ZHANGSAN");  
  5.             values.put("NICKNAME""張三");  
  6.             long insert = db.insert(DBHelper.USERTABLE, values);  
  7.             transaction.markSuccessful();  
  8.         } finally {  
  9.             transaction.end();  
  10.         }  

OK,這就是SQLBrite類的一個簡單使用,很簡單,整個源碼也只有幾百行。


Demo下載http://download.csdn.net/detail/u012702547/9633237



以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章