杰瑞教育

技术分享PARTICIPANTS STYLE
您当前的位置:首页 > 技术分享

android_orm框架之greenDAO(二)

|
 一、概述

  上文对greenDao的使用步骤和基本用法给大家做了介绍,文章链接:http://www.cnblogs.com/jerehedu/p/4304766.html 

  现在将继续深入学习greenDAO。数据查询展示是应用中最常用的功能之一,greenDAO为我们提供了强大的查询支持,并且采用完全面向对象的方式,即使一点都不懂SQL也没有问题。

 二、功能实现

  首先按照上文所述过程生成java实体类和dao类,并插入测试数据,主要代码如下:

  生成器代码:

复制内容到剪贴板
  1. public static void main(String[] args) throws IOException, Exception {  
  2.     //创建schema对象  
  3.     Schema scheme = new Schema(1"com.jredu.entity");  
  4.     scheme.setDefaultJavaPackageDao("com.jredu.dao");  
  5.     //添加Employee实体  
  6.     Entity employee= scheme.addEntity("Employee");  
  7.     employee.addIdProperty();  
  8.     employee.addStringProperty("name");  
  9.     employee.addStringProperty("sex");  
  10.     employee.addDateProperty("birthday");  
  11.     employee.addDateProperty("hireDate");  
  12.     employee.addLongProperty("deptno");  
  13.     //创建java类  
  14.     new DaoGenerator().generateAll(scheme, "E:\\android_space\\JREDU_GREENDAO\\src");  
  15. }  

  插入测试数据:

复制内容到剪贴板
  1. List<Employee> list = new ArrayList<Employee>();  
  2.     list.add(new Employee(null"张三""男"new Date(), new Date(), 1l));  
  3.     list.add(new Employee(null"李四""男"new Date(), new Date(), 1l));  
  4.     list.add(new Employee(null"王五""男"new Date(), new Date(), 1l));  
  5.     list.add(new Employee(null"章章""女"new Date(), new Date(), 1l));  
  6.     list.add(new Employee(null"赵六""女"new Date(), new Date(), 2l));  
  7.     list.add(new Employee(null"赵七""男"new Date(), new Date(), 1l));  
  8.     employeeDao.insertInTx(list);  

  准备工作完成后,我们看看如何使用greenDAO进行数据查询,DAO类除了提供load系列方法外,还通过QueryBuilder对象可以进行复杂查询。

  Load系列方法如下:

public T load(K key):根据主键加载实体对象

public T loadByRowId(long rowId):根据rowId加载实体对象

public List<T> loadAll():加载所有有效实体对象。

  Load系列方法比较简单,在此不做赘述,下面我们主要研究如何通过QueryBuilder对象进行查询。

  QueryBuilder是greenDAO提供的专门用于构建查询的类,使用此类,在查询时我们可以不用使用SQL,比如查询所有员工信息,我们可以使用如下代码:

复制内容到剪贴板
  1.     //查询所有员工信息  
  2. QueryBuilder<Employee> employeeQuerBuilder= employeeDao.queryBuilder();  
  3. employeeQuerBuilder.list();  

  通过logcat,可查看生成的SQL。

  那么如何进行条件查询?QueryBuilder为我们提供了用于构造查询条件的方法,方法原型如下:

1、public QueryBuilder<T> where(WhereCondition cond, WhereCondition... condMore):使用and连接多个查询条件。

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构成查询条件

  通过以上方法,我们可以看出使用以上方法需要构建WhereCondition对象,通过查看文档我们可以通过Dao类中生成的对应实体的Property对象进行构造,

  property部分源码如下:

复制内容到剪贴板
  1. /** Creates an "equal ('=')" condition  for this property. */  
  2.     public WhereCondition eq(Object value) {  
  3.         return new PropertyCondition(this"=?", value);  
  4.     }  
  5.   
  6.     /** Creates an "not equal ('<>')" condition  for this property. */  
  7.     public WhereCondition notEq(Object value) {  
  8.         return new PropertyCondition(this"<>?", value);  
  9.     }  
  10.   
  11.     /** Creates an "LIKE" condition  for this property. */  
  12.     public WhereCondition like(String value) {  
  13.         return new PropertyCondition(this" LIKE ?", value);  
  14.     }  
  15.   
  16.     /** Creates an "BETWEEN ... AND ..." condition  for this property. */  
  17.     public WhereCondition between(Object value1, Object value2) {  
  18.         Object[] values = { value1, value2 };  
  19.         return new PropertyCondition(this" BETWEEN ? AND ?", values);  
  20.     }  
  21.   
  22.     /** Creates an "IN (..., ..., ...)" condition  for this property. */  
  23.     public WhereCondition in(Object... inValues) {  
  24.         StringBuilder condition = new StringBuilder(" IN (");  
  25.         SqlUtils.appendPlaceholders(condition, inValues.length).append(')');  
  26.         return new PropertyCondition(this, condition.toString(), inValues);  
  27.     }  

  通过源码我们可以看出,property类中提供了大量构造WhereCondition的方法,这些方法都是用于构造sql语句内容的。下面我们使用一些例子用来说明如何使用:

 三、案例实现

例1:查询部门1中所有员工

复制内容到剪贴板
  1. employeeQuerBuilder.where(EmployeeDao.Properties.Deptno.eq(1l));  
  2. employees = employeeQuerBuilder.list();  

例2:查询部门1中男性员工和部门2中女性员工

复制内容到剪贴板
  1. WhereCondition whereCondition1=   
  2.        employeeQuerBuilder.and(Properties.Deptno.eq(1l),Properties.Sex.eq("男"));  
  3.   
  4. WhereCondition whereCondition2=  
  5.        employeeQuerBuilder.and(Properties.Deptno.eq(2l),Properties.Sex.eq("女"));  
  6.   
  7. employees =employeeQuerBuilder.whereOr(whereCondition1, whereCondition2).list();  

  实际上QueryBuilder对象每次调用list方法查询时都是先创建了一个Query对象,Query对象最终用于查询数据库。通过文档和源码,我们知道Query是一个可重复使用的用于查询返回实体的查询对象。比如例子2中,我们将条件改为查询部门1中的女性员工和部门2中的男性员工,重用例子2中的Query对象,这样要比每次都使用QueryBuilder的list方法更加高效

复制内容到剪贴板
  1. Query<Employee> query= employeeQuerBuilder.whereOr(whereCondition1, whereCondition2).build();  
  2. query.setParameter(0, 1l);  
  3. query.setParameter(1"女");  
  4. query.setParameter(2, 2l);  
  5. query.setParameter(3"男");  
  6. employees = query.list();  

捷瑞数字 版权所有Copyright © 2014 All rights reserved [鲁ICP备09041295号] 管理员登陆