相信小伙伴们在开发中或多或少都可能遇到过这样的问题:打开一个应用后,为了快速响应,先将数据库中的数据呈现给用户,然后再去网络上请求数据,请求成功之后将数据缓存至数据库,同时更新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

以上。

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

  1. 一个响应式框架——agera

    Google在上周开源了一个响应式框架——agera,相信它会慢慢地被广大程序员所熟知.我个人对这样的技术是很感兴趣的,在这之前也研究过RxJava,所以在得知Google开源了这样的框架之后第一时间 ...

  2. kube框架结构-一个小型响应式CSS框架

    当你开始初建一个新的项目时,你可能需要一个不太复杂的基础框架,Kube框架应该是你最好的选择.一个独立的CSS文件,帮助你更简单的创建响应式的的布局设计. Kube Framework包括网格.按钮. ...

  3. SpaceBase – 基于 Sass 的响应式 CSS 框架

    SpaceBase 是一个基于 Sass 的响应式 CSS 框架.SpaceBase 是可以在建立和定制您的需要的一个样板层,它结合最佳实践为今天的响应式网页与我们对每一个项目中使用的核心组件. 在线 ...

  4. AudioPlayer.js,一个响应式且支持触摸操作的jquery音频插件

    AudioPlayer.js是一个响应式.支持触摸操作的HTML5 的音乐播放器.本文是对其官网的说用说明文档得翻译,博主第一次翻译外文.不到之处还请谅解.之处. JS文件地址:http://osva ...

  5. 16个最佳响应式HTML5框架分享

    HTML5框架可以快速构建响应式网站,它们帮助程序员减少编码工作,减少冗余的代码.如今有很多免费的HTML5框架可供使用,由于它们有着响应式设计.跨浏览器兼容.相对轻量级等特点,这些框架在开发中都十分 ...

  6. EDM响应式邮件框架:MJML

    概述 新课题研究:响应式邮件框架MJML(MJML官网:https://mjml.io/)姐妹篇: EDM响应式邮件框架:Formerly Ink 介绍 MJML是一种标记语言,设计用于轻松实现一个响 ...

  7. elf,基于flexbox的响应式CSS框架

    官网地址:http://jrainlau.github.io/elf/项目地址:https://github.com/jrainlau/elf 介绍 取名为"精灵"的elf,是一个 ...

  8. 使用media Queries实现一个响应式的菜单

    Media queries是CSS3引入的一个特性,使用它可以方便的实现各种响应式效果.在这个示例中我们将会使用media queries实现一个响应式的菜单.这个菜单会根据当前浏览器屏幕的大小变化而 ...

  9. 使用jQuery开发一个响应式超酷整合RSS信息阅读杂志

    在线演示1 本地下载     申请达人,去除赞助商链接 如果大家喜欢阅读博客文章的话,可能都会使用RSS阅读器,今天这里我们将使用jQuery来开发一个响应式的RSS信息阅读应用,使用它你可以将你喜欢 ...

随机推荐

  1. 提示29. 怎样避免延迟加载或Load()阅读器问题

    提示29. 怎样避免延迟加载或Load()阅读器问题 如果你有如下这样的代码: 1 var results = from c in ctx.Customers 2 where c.SalesPerso ...

  2. JVM内存结构之一--总体介绍

    Java 虚拟机在执行Java程序的时候会把它管理的内存区域划为几部分,这一节我们就来解析一下Java的内存区域. 有的人把JVM管理的内存简单地分为堆内存和栈内存,这样分未免有些太肤浅了. Java ...

  3. Linux下如何保持gnome-terminal窗口执行命令后停留而不立刻关闭(gnome-terminal -x)

    Linux下如何保持gnome-terminal窗口执行命令后停留而不立刻关闭(gnome-terminal -x) 转自:http://jakfruit.blog.163.com/blog/stat ...

  4. exercise.tour.go google的go官方教程答案

    /* Exercise: Loops and Functions #43 */ package main import ( "fmt" "math" ) fun ...

  5. nyoj 236 心急的C小加

    心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的 ...

  6. unigui多页签UI框架

    procedure TMainForm.openForm(Caption, FormClassName: string);var i: integer; sheet: TUniTabSheet;beg ...

  7. [Objective-c 基础 - 2.3] 继承、组合

    A.继承的实现: is a 1.不允许子类.父类存在相同的成员变量 2.方法调用优先原则:子类调用方法的时候,优先从本类寻找,若无则向上在父类中寻找 3.重写:子类重新实现父类的方法,覆盖父类之前的方 ...

  8. Articulate Studio课间制作工具

    Articulate Studio可以说是目前国际上用户最广泛的e-learning课件制作工具之 一,通过Articulate Studio,你可以方便.快捷的创建引人入胜的Flash演示和e-le ...

  9. [css]inline-block

    能被父容器居中.能设置高度宽度和margin.不会像table或div那样占一正行……——这就是inline-block——记得这是浏览器默认样式告诉你的.

  10. 【Stage3D学习笔记续】山寨Starling(二):VertexData探幽

    还记得之前的学习笔记中我们的顶点缓冲数组中的顶点数据么,我们使用一个一维数组来记录所有的顶点数据,这是由于顶点缓冲上传数据时是使用的一维数组. 如果对顶点数据进行一层代码的封装,就能更加的方便我们来操 ...