智慧并不产生于学历,而是来自对于知识的终生不懈的追求。这篇文章主要讲述android_orm框架之greenDAO相关的知识,希望能为你提供帮助。
一、概述 |
现在将继续深入学习greenDAO。数据查询展示是应用中最常用的功能之一,greenDAO为我们提供了强大的查询支持,并且采用完全面向对象的方式,即使一点都不懂SQL也没有问题。
二、功能实现 |
生成器代码:
文章图片
public static void main(String[] args) throws IOException, Exception { //创建schema对象 Schema scheme = new Schema(1, "com.jredu.entity"); scheme.setDefaultJavaPackageDao("com.jredu.dao"); //添加Employee实体 Entity employee= scheme.addEntity("Employee"); employee.addIdProperty(); employee.addStringProperty("name"); employee.addStringProperty("sex"); employee.addDateProperty("birthday"); employee.addDateProperty("hireDate"); employee.addLongProperty("deptno"); //创建java类 new DaoGenerator().generateAll(scheme, "E:\\\\android_space\\\\JREDU_GREENDAO\\\\src"); }
文章图片
插入测试数据:
文章图片
List< Employee> list = new ArrayList< Employee> (); list.add(new Employee(null, "张三", "男", new Date(), new Date(), 1l)); list.add(new Employee(null, "李四", "男", new Date(), new Date(), 1l)); list.add(new Employee(null, "王五", "男", new Date(), new Date(), 1l)); list.add(new Employee(null, "章章", "女", new Date(), new Date(), 1l)); list.add(new Employee(null, "赵六", "女", new Date(), new Date(), 2l)); list.add(new Employee(null, "赵七", "男", new Date(), new Date(), 1l)); employeeDao.insertInTx(list);
文章图片
准备工作完成后,我们看看如何使用greenDAO进行数据查询,DAO类除了提供load系列方法外,还通过QueryBuilder对象可以进行复杂查询。
Load系列方法如下:
public T load(K key):根据主键加载实体对象Load系列方法比较简单,在此不做赘述,下面我们主要研究如何通过QueryBuilder对象进行查询。
public T loadByRowId(long rowId):根据rowId加载实体对象
【android_orm框架之greenDAO】public List< T> loadAll():加载所有有效实体对象。
QueryBuilder是greenDAO提供的专门用于构建查询的类,使用此类,在查询时我们可以不用使用SQL,比如查询所有员工信息,我们可以使用如下代码:
//查询所有员工信息 QueryBuilder< Employee> employeeQuerBuilder= employeeDao.queryBuilder(); employeeQuerBuilder.list();
通过logcat,可查看生成的SQL。
文章图片
那么如何进行条件查询?QueryBuilder为我们提供了用于构造查询条件的方法,方法原型如下:
1、public QueryBuilder< T> where(WhereCondition cond, WhereCondition... condMore):使用and连接多个查询条件。通过以上方法,我们可以看出使用以上方法需要构建WhereCondition对象,通过查看文档我们可以通过Dao类中生成的对应实体的Property对象进行构造,
2、public QueryBuilder< T> whereOr(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore):使用or连接多个查询条件。
3、public QueryBuilder< T> orderDesc(Property... properties):排序
4、public WhereCondition or(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore):使用or构成查询条件
5、public WhereCondition or(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore):使用and构成查询条件
property部分源码如下:
文章图片
/** Creates an "equal (\'=\')" conditionfor this property. */ public WhereCondition eq(Object value) { return new PropertyCondition(this, "=?", value); }/** Creates an "not equal (\'< > \')" conditionfor this property. */ public WhereCondition notEq(Object value) { return new PropertyCondition(this, "< > ?", value); }/** Creates an "LIKE" conditionfor this property. */ public WhereCondition like(String value) { return new PropertyCondition(this, " LIKE ?", value); }/** Creates an "BETWEEN ... AND ..." conditionfor this property. */ public WhereCondition between(Object value1, Object value2) { Object[] values = { value1, value2 }; return new PropertyCondition(this, " BETWEEN ? AND ?", values); }/** Creates an "IN (..., ..., ...)" conditionfor this property. */ public WhereCondition in(Object... inValues) { StringBuilder condition = new StringBuilder(" IN ("); SqlUtils.appendPlaceholders(condition, inValues.length).append(\')\'); return new PropertyCondition(this, condition.toString(), inValues); }
文章图片
通过源码我们可以看出,property类中提供了大量构造WhereCondition的方法,这些方法都是用于构造sql语句内容的。下面我们使用一些例子用来说明如何使用:
三、案例实现 |
employeeQuerBuilder.where(EmployeeDao.Properties.Deptno.eq(1l)); employees = employeeQuerBuilder.list();
文章图片
例2:查询部门1中男性员工和部门2中女性员工
文章图片
WhereCondition whereCondition1= employeeQuerBuilder.and(Properties.Deptno.eq(1l),Properties.Sex.eq("男"));
WhereCondition whereCondition2= employeeQuerBuilder.and(Properties.Deptno.eq(2l),Properties.Sex.eq("女"));
employees =employeeQuerBuilder.whereOr(whereCondition1, whereCondition2).list();
文章图片
文章图片
实际上QueryBuilder对象每次调用list方法查询时都是先创建了一个Query对象,Query对象最终用于查询数据库。通过文档和源码,我们知道Query是一个可重复使用的用于查询返回实体的查询对象。比如例子2中,我们将条件改为查询部门1中的女性员工和部门2中的男性员工,重用例子2中的Query对象,这样要比每次都使用QueryBuilder的list方法更加高效
文章图片
Query< Employee> query= employeeQuerBuilder.whereOr(whereCondition1, whereCondition2).build(); query.setParameter(0, 1l); query.setParameter(1, "女"); query.setParameter(2, 2l); query.setParameter(3, "男"); employees = query.list();
文章图片
文章图片
推荐阅读
- Android中的文件下载——DownLoadManager
- Android自定义控件系列之基础篇
- Android studio 中R.menu的创建
- Wrapper-装箱和拆箱
- 基于XMPP 协议的开发 android
- Android加密算法之AES加密和解密实现
- 原创10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程)
- 基于路由机制设计的app架构思路
- Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护