一个响应式数据库框架SQLBrite,完美解决数据库和UI的同步更新!
相信小伙伴们在开发中或多或少都可能遇到过这样的问题:打开一个应用后,为了快速响应,先将数据库中的数据呈现给用户,然后再去网络上请求数据,请求成功之后将数据缓存至数据库,同时更新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
以上。
蓝天为路,阳光满屋。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?