一、背景
Android数据库SQLite原生API SqliteOpenHelper不友好,所以出现了许多ORM框架来帮助我们处理数据库操作。所谓ORM框架,即Object-Relational Mapping,它的作用是在关系型数据库和对象之间做一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。而GreenDao是基于Android的ORM框架中的佼佼者,优点如下:
- 性能(可能是Android上最快的ORM)
- 易用性(强大的API,涵盖关系和链接)
- 轻量(最小的内存消耗与小于100KB的库大小)
二、GreenDAO使用
1、引入:
1、在项目的gradle中添加插件
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.2'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // 添加插件 更好支持GreenDao
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
2、在模块的gradle中应用插件
apply plugin: 'org.greenrobot.greendao'
3、在模块的gradle中添加依赖
implementation 'org.greenrobot:greendao:3.2.2' // 添加库
4、(可选项)初始化GreenDao配置,在app下的build.gradle目录下。
greendao {
schemaVersion 1 //当前数据库版本
}
2、使用方法代码演示
1、创建实体类:
@Entity
public class GoodsModel {
@Id(autoincrement = true)
private Long id;
private Integer goodsId;
private String name;
private String icon;
private String info;
private String type;
}
2、创建完成后,点击build -> make project,可以看到实体类自动生成一些代码:
@Entity
public class GoodsModel {
@Id(autoincrement = true)
private Long id;
private Integer goodsId;
private String name;
private String icon;
private String info;
private String type;
@Generated(hash = 1834473137)
public GoodsModel(Long id, Integer goodsId, String name, String icon,
String info, String type) {
this.id = id;
this.goodsId = goodsId;
this.name = name;
this.icon = icon;
this.info = info;
this.type = type;
}
@Generated(hash = 971639536)
public GoodsModel() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getGoodsId() {
return this.goodsId;
}
public void setGoodsId(Integer goodsId) {
this.goodsId = goodsId;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getIcon() {
return this.icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getInfo() {
return this.info;
}
public void setInfo(String info) {
this.info = info;
}
public String getType() {
return this.type;
}
public void setType(String type) {
this.type = type;
}
}
同时app的build中多出greendao文件夹:
3、创建会话,这里的会话Session可以理解为上下文,一般一个应用中可以共用,所以这里直接在Applicaton中进行创建并保存为成员变量。
public class MyApplication extends Application {
public static DaoSession mDaoSession;
@Override
public void onCreate() {
super.onCreate();
initDB();
}
/**
* 连接数据库并创建会话
*/
private void initDB() {
//1.获取需要连接的数据库
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "test.db");
SQLiteDatabase db = devOpenHelper.getWritableDatabase();
//2.创建数据库连接
DaoMaster daoMaster = new DaoMaster(db);
//3.创建数据库会话
mDaoSession = daoMaster.newSession();
}
}
4、封装一个管理类,封装对该数据库的操作
public class GreenDaoManager {
private Context mContext;
private GoodsModelDao mGoodsModelDao;
public GreenDaoManager(Context context) {
this.mContext = context;
this.mGoodsModelDao = MyApplication.mDaoSession.getGoodsModelDao();
}
/**
* 添加所有数据到数据库
*/
public void insertGoodes() {
List<GoodsModel> goodsModels = new ArrayList<>();
//todo 从本地文件或其他来源中读取数据解析到goodsModels中
//将goodsModels中的所有数据添加到数据库中
mGoodsModelDao.insertInTx(goodsModels);
}
}
5、数据库查询操作
GreenDaoManager中增加方法:
/**
* 筛选水果
* @return 查询结果列表
*/
public List<GoodsModel> queryFruits() {
QueryBuilder<GoodsModel> queryBuilder = mGoodsModelDao.queryBuilder()
.where(GoodsModelDao.Properties.Type.eq("fruits"));
return queryBuilder.list();
6、数据库更新与删除操作
GreenDaoManager中增加更新和删除方法,使用时,先查询得到对应的数据实体,修改数据实体中的内容后再传入这两个方法中进行操作。
/**
* 删除数据
* @param goodsModel 要删除的数据
*/
public void deleteGoodsInfo(GoodsModel goodsModel) {
mGoodsModelDao.delete(goodsModel);
}
/**
* 更新数据
* @param goodsModel 要更新的数据
*/
public void updateGoodsInfo(GoodsModel goodsModel) {
mGoodsModelDao.update(goodsModel);
}
三、数据库加密
使用数据库时,我们的数据库将会被存放到本地,这样很不安全,我们可以在代码中为数据库设置密码,这样在从外部使用工具软件打开本地的数据库文件时需要输入密码才可以查看。
引入sqlcipher库:
implementation 'net.zetetic:android-database-sqlcipher:4.2.0'
对连接数据库的地方进行修改,设置密码:
/**
* 连接数据库并创建会话
*/
private void initDB() {
//1.获取需要连接的数据库
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "test.db");
// SQLiteDatabase db = devOpenHelper.getWritableDatabase();
String password = "123456";
Database db = devOpenHelper.getEncryptedWritableDb(password);
//2.创建数据库连接
DaoMaster daoMaster = new DaoMaster(db);
//3.创建数据库会话
mDaoSession = daoMaster.newSession();
}