前言:
Greendao是一款用于数据库创建与管理的框架,由于原生SQLite语言比较复杂繁琐,使得不少程序员不得不去学习SQLite原生语言,但是学习成本高,效率低下,所以不少公司致力于开发一款简单的数据库管理框架,较为著名的就有Greendao和ORMLite,但是就数据分析来看,Greendao的效率是高于ORMLite及其他框架的,是目前该行业的领先者。也因为Greendao的使用方法简便,且效率高使得其成为目前使用最为广泛的数据库管理框架,这也是广大程序员的福音。
优点:
存取速度快
支持数据库加密
轻量级
激活实体
支持缓存
代码自动生成
使用:
github 链接:https://github.com/greenrobot/greenDAO
1. 环境配置:
在项目的build.gradle文件下进入如下配置 (注释的地方就是要添加的东西)
在App的build.gradle文件下进行如下配置 (注释的地方就是要添加的东西)
2.新建实体类用@Entity注解,实体类中的属性即为数据库中对应的字段,最后build项目即会生成相应的代码
build之前实体类如下:
build之前实体类如下:
比build之前多了构造方法和set,get方法
另外自动生成了DaoMaster,DaoSession,HistoryDataDao三个类
注解解释
1.@Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
2.@Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
3.@Property:可以自定义字段名,注意外键不能使用该属性
4.@NotNull:属性不能为空
5.@Transient:使用该注释的属性不会被存入数据库的字段中
6.@Unique:该属性值必须在数据库中是唯一值
7.@Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
3. 创建数据库
可以发现,GreenDao已经将我们的数据库创建缩成几句话,代码会自动将实体类对象创建成表,不再是传统的手写SQL语句。这里的数据库创建只需要在MyApplication中执行一次即可,这里对几个类进行解释DevOpenHelper:创建SQLite数据库的SQLiteOpenHelper的具体实现DaoMaster:GreenDao的顶级对象,作为数据库对象、用于创建表和删除表DaoSession:管理所有的Dao对象,Dao对象中存在着增删改查等API
由于我们已经创建好了DaoSession和HistoryData的实体类对象,编译后会自动生成我们的HistoryDataDao对象,可通过DaoSession获得HistoryDataDao historyDataDao = daoSession.getHistoryDataDao();
这里的Dao(Data Access Object)是指数据访问接口,即提供了数据库操作一些API接口,可通过dao进行增删改查操作
代码复制如下:
public class DaoManager {
private static DaoManagerinstance;
private static DaoMasterdaoMaster;
public static DaoManagergetInstance() {
if (instance ==null) {
instance =new DaoManager();
}
return instance;
}
public DaoManager(){
//创建数据库
DaoMaster.OpenHelper helper =new DaoMaster.DevOpenHelper(MyApplication.getContext(),"read",null);
//获取数据库可读
daoMaster =new DaoMaster(helper.getWritableDatabase());
}
public DaoSessiongetSession(){
return daoMaster.newSession();
}
}
4. 数据库的增删改查
第一:插入多条数据
BookBeansDao bookBeansDao = DaoManager.getInstance().getSession().getBookBeansDao();
for (int i =0; i <10; i++) {
BookBeans bookBeans =new BookBeans();
bookBeans.setTitle(i+"");
bookBeans.setContent(i+"");
bookBeansDao.insertInTx(bookBeans);
}
常用API
//这是最简单的插入语句,新增一行数据,返回值为行号
public long insert(T entity)
//传递一个数组,新增多行数据
public void insertInTx(T... entities)
//传递一个集合,新增多行数据
public void insertInTx(Iterable<T> entities)
//传递一个集合,新增多行数据,setPrimaryKey:是否设置主键
public void insertInTx(Iterable<T> entities, boolean setPrimaryKey)
//将给定的实体插入数据库,若此实体类存在,则覆盖
public long insertOrReplace(T entity)
//使用事务操作,将给定的实体插入数据库,若此实体类存在,则覆盖
public void insertOrReplaceInTx(T... entities)
//使用事务操作,将给定的实体插入数据库,若此实体类存在,则覆盖
public void insertOrReplaceInTx(Iterable<T> entities)
//使用事务操作,将给定的实体插入数据库,若此实体类存在,则覆盖,并设置是否设定主键
public void insertOrReplaceInTx(Iterable<T> entities, boolean setPrimaryKey)
第二:删除
DaoManager.getInstance().getSession().getBookBeansDao().deleteByKeyInTx((long) 1);
常用API
//根据实体,删除一条数据(默认根据主键删除数据)
public void delete(T entity)
//删除所有数据
public void deleteAll()
//根据key删除数据
public void deleteByKey(K key)
//删除多条数据
public void deleteInTx(T... entities)
//根据主键数组,删除多条数据
public void deleteByKeyInTx(K... keys)
//根据集合,删除多条数据
public void deleteByKeyInTx(Iterable<K> keys)
第三:修改
DaoManager.getInstance().getSession().getBookBeansDao().update(bookBeans);
常用API
//根据实体更新
public void update(T entity)
//批量更新
public void updateInTx(T... entities)
// 在一次事物中提交全部实体类
public void updateInTx(Iterable<T> entities)
第四:查询所有数据
DaoManager.getInstance().getSession().getBookBeansDao().loadAll();
常用API
常用API//根据主键来查询一条数据
public T load(K key)
//根据行号来查询一条数据,行号从1开始
public T loadByRowId(long rowId)
//查询表中所有的数据
public List<T> loadAll()
QueryBuilder查询常用方法
常用API
// 条件,AND 连接
public QueryBuilder<T> where(WhereCondition cond, WhereCondition... condMore)
// 条件,OR 连接
public QueryBuilder<T> whereOr(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore)
//去重
public QueryBuilder<T> distinct()
//分页
public QueryBuilder<T> limit(int limit)
//偏移结果起始位,配合limit(int)使用
public QueryBuilder<T> offset(int offset)
//排序,升序
public QueryBuilder<T> orderAsc(Property... properties)
//排序,降序
public QueryBuilder<T> orderDesc(Property... properties)
// 排序,自定义
public QueryBuilder<T> orderCustom(Property property, String customOrderForProperty)
// 排序,SQL 语句
public QueryBuilder<T> orderRaw(String rawOrder)
//本地化字符串排序,用于加密数据库无效
public QueryBuilder<T> preferLocalizedStringOrder()
//自定义字符串排序,默认不区分大小写
public QueryBuilder<T> stringOrderCollation(String stringOrderCollation)
判断条件
//等于 eq()
//不等于 notEq()
//值等于 like()
//取中间范围 between()
//in命令 in()
//not in 命令 notIn()
//大于 gt()
//小于 lt()
//大于等于 ge()
//小于等于 le()
//为空 isNull()
//不为空 isNotNull()
查询所有
// 查询所有
Listlist= studentDao.queryBuilder().list();
Log.e(TAG,"onCreate: "+list.size());
// And条件查询
List<Student> list = studentDao.queryBuilder() .where(StudentDao.Properties.MId.eq(2)) .where(StudentDao.Properties.ClassName.eq("一年级")) .list();
Log.e(TAG, "onCreate: "+list.size());
// Or条件查询
List<Student> list = studentDao.queryBuilder() .whereOr(StudentDao.Properties.ClassName.eq("一年级"), StudentDao.Properties.MId.eq(2)) .list(); Log.e(TAG, "onCreate: "+list.size());
偏移查询
// 查询10条数据、偏移5条数据
List<Student> list = studentDao.queryBuilder() .offset(5) .limit(10) .list();
Log.e(TAG, "onCreate: "+list.size());
// 模糊查询(%级% 代表“级”前面和后面可能存在字符,也可以不存在) // 一% 表示以一开头的字符串
List<Student> list = studentDao.queryBuilder() .where(StudentDao.Properties.ClassName.like("%级%")) .list();
Log.e(TAG, "onCreate: "+list.size());
// 返回按照年龄倒序排序
List<Student> list = studentDao.queryBuilder() .orderDesc(StudentDao.Properties.MAge) .list();
Log.e(TAG, "onCreate: "+list.size());
// in操作符
List<Student> list = studentDao.queryBuilder() .where(StudentDao.Properties.MId.in(1,2,3)) .list();
Log.e(TAG, "onCreate: "+list.size());
// sql语句查询
List<Student> list = studentDao.queryBuilder() .where(new WhereCondition.StringCondition(StudentDao.Properties.ClassName.columnName+"=?","一年级")) .list();
Log.e(TAG, "onCreate: "+list.size());