轉載優秀博文: http://blog.csdn.net/u012702547/article/details/52577403
相信小夥伴們在開發中或多或少都可能遇到過這樣的問題:打開一個應用後,爲了快速響應,先將數據庫中的數據呈現給用戶,然後再去網絡上請求數據,請求成功之後將數據緩存至數據庫,同時更新UI,但是我們經常會這樣想,可不可以我只將數據緩存至數據庫,當數據庫中的數據發生改變時,UI會自動更新?這個當然可以實現,我們今天就來看看square公司推出的一個響應式數據庫框架SQLBrite。
1.準備工作
SQLBrite項目地址:https://github.com/square/sqlbrite
將SQLBrite引入到我們的項目中:
-
compile 'com.squareup.sqlbrite:sqlbrite:0.7.0'
在處理線程問題時,由於要使用到RxAndorid中相關的類,所以我們還要引入RxAndroid:
-
compile 'io.reactivex:rxandroid:1.1.0'
另外:
SQLBrite的使用基於RxJava的使用,如果小夥伴們對RxJava的使用尚不熟悉,請移步這裏RxAndroid結合Retrofit,看看誰纔是最佳拍檔!
2.開始使用
和以前一樣,講解代碼之前我們先來看看效果圖:
大家看到,當我添加數據時ListView會自動更新,刪除數據或者修改數據時ListView一樣會自動更新,就是這麼簡單一個效果,我們來看看實現方式。
2.1創建DBHelper
首先我們需要創建一個DBHelper,由於SQLBrite只是對數據的增刪改查過程重新做了封裝,其他的以前怎麼寫現在還是怎麼寫。DBHelper的創建和我們Sqlite中DBHelper的創建方式一模一樣,假設我創建一個User表,如下:
-
public class DBHelper extends SQLiteOpenHelper {
-
-
private static final String DBNAME = "sang.db";
-
private static final int CURRENTVERSION = 1;
-
public static final String USERTABLE = "usertable";
-
-
public DBHelper(Context context) {
-
super(context, DBNAME, null, CURRENTVERSION);
-
}
-
-
@Override
-
public void onCreate(SQLiteDatabase db) {
-
db.execSQL("CREATE TABLE IF NOT EXISTS " + USERTABLE + "(_id INTEGER PRIMARY KEY AUTOINCREMENT,USERNAME,NICKNAME);");
-
}
-
-
@Override
-
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-
-
}
-
}
2.2初始化數據庫,獲取db對象
獲取db對象只要三行代碼,如下:
-
SqlBrite sqlBrite = SqlBrite.create();
-
DBHelper dbHelper = new DBHelper(this);
-
db = sqlBrite.wrapDatabaseHelper(dbHelper, AndroidSchedulers.mainThread());
第一步先是獲取一個SqlBrite對象,這個通過create方法直接獲取即可,然後創建一個DBHelper的實例,最後通過sqlBrite類中的wrapDatabaseHelper方法來獲取一個db實例,第一個參數不必說,第二個參數表示數據庫的操作是在哪一個線程中進行的,AndroidSchedulers.mainThread()方法表示數據庫的操作在主線程中執行。獲取的db對象之後,後面的增刪改查操作我們都要在這個db對象中進行。
2.3添加數據
-
ContentValues values = new ContentValues();
-
values.put("USERNAME", "ZHANGSAN");
-
values.put("NICKNAME", "張三");
-
long insert = db.insert(DBHelper.USERTABLE, values);
第一個參數表示要操作的表名,第二個參數表示要插入的數據。
2.4刪除數據
-
db.delete(DBHelper.USERTABLE, "_id < ?", new String[]{5 + ""});
這裏的參數都很簡單,不多說。
2.5修改數據
-
ContentValues values = new ContentValues();
-
values.put("USERNAME", "LISI");
-
db.update(DBHelper.USERTABLE, values, "_id < ? and _id > ?", new String[]{20 + "", 10 + ""});
2.6查詢數據
-
QueryObservable query = db.createQuery(DBHelper.USERTABLE, "SELECT * FROM " + DBHelper.USERTABLE, null);
-
query.subscribe(new Action1<SqlBrite.Query>() {
-
@Override
-
public void call(SqlBrite.Query query) {
-
Cursor cursor = query.run();
-
List<String> list = new ArrayList<String>();
-
while (cursor.moveToNext()) {
-
String username = cursor.getString(cursor.getColumnIndex("USERNAME"));
-
String id = cursor.getString(cursor.getColumnIndex("_id"));
-
String nickname = cursor.getString(cursor.getColumnIndex("NICKNAME"));
-
list.add(id + "--" + username + "--" + nickname);
-
}
-
cursor.close();
-
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, list);
-
lv.setAdapter(adapter);
-
}
-
});
SQLBrite中可以直接通過SQL語句來查詢數據,拿到Cursor對象之後剩下的就好說了。
2.7事務的使用
大批量進行數據插入操作的時候,我們可以使用事務,使用方式如下:
-
BriteDatabase.Transaction transaction = db.newTransaction();
-
try {
-
ContentValues values = new ContentValues();
-
values.put("USERNAME", "ZHANGSAN");
-
values.put("NICKNAME", "張三");
-
long insert = db.insert(DBHelper.USERTABLE, values);
-
transaction.markSuccessful();
-
} finally {
-
transaction.end();
-
}
OK,這就是SQLBrite類的一個簡單使用,很簡單,整個源碼也只有幾百行。
Demo下載http://download.csdn.net/detail/u012702547/9633237
以上。