前言
现在的应用基本上都已经实现了联网功能,但是网络无法保证始终处于畅通的状态,如果只要没网或者网络较慢就展示空白页面给用户,这种使用体验非常不好。数据的缓存功能就能够很好的解决这种问题,数据库通常都被作为有结构的数据缓存的首选,greendao实现了Android应用快速开发和集成数据存储功能,现在来简单使用下greendao框架。
配置
在项目的根目录下的build.gradle中配置greendao需要使用的gradle插件。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
}
}
接下来在需要使用greendao功能的模块build.gradle里应用greendao的插件,并且在dependencies配置里增加上greendao的依赖,同时还要在这个文件的全局设置greendao生成的代码位置和对应数据库的版本号。
apply plugin: 'com.android.library'
apply plugin: 'org.greenrobot.greendao'
...
greendao {
schemaVersion 1
daoPackage 'com.example.download.db.greendao'
targetGenDir 'src/main/java'
}
...
dependencies {
...
compile 'org.greenrobot:greendao:3.2.2'
}
添加完成之后需要sync以下gradle配置,等到sync完成就可以使用greendao提供的功能。
添加Entity
在配置阶段制定的greendao生成目录里增加一个简单的JavaBean类,为这个类增加@Entity标签,同时写上所有要保存的字段,定义好id字段,注意使用自增长id时一定要确保id是Long类型的,同时配上@Id(autoincrement=true)。
@Entity
public class DownloadEntity {
@Id(autoincrement = true)
private Long id;
private Long startPosition;
private Long endPosition;
private Long progressPosition;
private String downloadUrl;
private Integer threadId;
}
写完了上面定义的Entity之后需要重新生成整个项目,点击Android Studio菜单栏的Build -> Make Project功能,等重新生成完代码会发现在制定greendao包下面多了很多greendao为用户自动生成的数据库存储类,这些类还是比较原始的需要用户自己封装它们来使用。
添加封装代码
封装代码可以使用单例模式,把所有数据库操作的对象都封装在这个单例对象中,用户只需要调用这个封装对象的单例来处理数据库操作。现在封装对象暂时只支持entity的插入功能和查询功能。
public class DownloadHelper {
private static DownloadHelper sHelper = new DownloadHelper();
private DaoMaster mMaster;
private DaoSession mSession;
private DownloadEntityDao mDao;
// 实现封装对象的单例
public static DownloadHelper getInstance() {
return sHelper;
}
private DownloadHelper() {
}
// 在Application中调用的初始化方法
public void init(Context context) {
// 创建简单的数据库
SQLiteDatabase db = new DaoMaster.DevOpenHelper(context, "download.db", null).getWritableDatabase();
// 初始化操作数据库的对象
mMaster = new DaoMaster(db);
mSession = mMaster.newSession();
mDao = mSession.getDownloadEntityDao();
}
// 插入entity功能
public void insert(DownloadEntity entity) {
mDao.insertOrReplace(entity);
}
// 查询Entity的功能
public List<DownloadEntity> getAll(String url) {
return mDao.queryBuilder()
.where(DownloadEntityDao.Properties.DownloadUrl.eq(url))
.orderAsc(DownloadEntityDao.Properties.ThreadId)
.list();
}
}
测试数据库
以前测试数据库的时候自己在代码里打印log日志把这个表的内容都打印出来,通常数据少的时候还能接受,多了就完全没法看。后来使用Root功能不停的adb pull拉取本地数据库查看,这两种方式都很低效。好在facebook发布了一款开源的工具stetho,在chrome浏览器中输入chrome://inspect/#devices,点击inspect指定的Android设备会打开Developer Tools窗口。在build.gradle的dependencies部分添加stetho以来,同时在Application中初始化它。
// build.gradle添加依赖
compile 'com.facebook.stetho:stetho:1.5.0'
// Application初始化
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
DownloadHelper.getInstance().init(this);
Stetho.initializeWithDefaults(this);
}
}
如果第一次打开这个窗口可能会一直处于白屏状态,这是因为被墙无法访问外网导致的,自己配置下VPN吧。查看Resources Tab页,左边的WebSQL-> download.db就是测试生成的数据库。