一个响应式数据库框架SQLBrite,完美解决数据库和UI的同步更新!

来源:互联网 发布:双肩背包淘宝 编辑:程序博客网 时间:2024/05/16 19:07

转载优秀博文: 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



以上。

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