標籤:tle date() strong itblog ati logs 調用 一點 roi
在上次greenDao第一篇文章中,我們對greenDao的使用步驟和基本用法給大家做了介紹,文章連結:http://www.cnblogs.com/jerehedu/p/4304766.html
現在將繼續深入學習greenDAO。資料查詢展示是應用中最常用的功能之一,greenDAO為我們提供了強大的查詢支援,並且採用完全物件導向的方式,即使一點都不懂SQL也沒有問題。
首先按照上文所述過程產生java實體類和dao類,並插入測試資料,主要代碼如下:
產生器代碼:
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):根據主鍵載入實體物件
public T loadByRowId(long rowId):根據rowId載入實體物件
public List<T> loadAll():載入所有有效實體物件。
Load系列方法比較簡單,在此不做贅述,下面我們主要研究如何通過QueryBuilder對象進行查詢。
QueryBuilder是greenDAO提供的專門用於構建查詢的類,使用此類,在查詢時我們可以不用使用SQL,比如查詢所有員工資訊,我們可以使用如下代碼:
//查詢所有員工資訊QueryBuilder<Employee> employeeQuerBuilder= employeeDao.queryBuilder();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部分源碼如下:
/** Creates an "equal (‘=‘)" condition for this property. */ public WhereCondition eq(Object value) { return new PropertyCondition(this, "=?", value); } /** Creates an "not equal (‘<>‘)" condition for this property. */ public WhereCondition notEq(Object value) { return new PropertyCondition(this, "<>?", value); } /** Creates an "LIKE" condition for this property. */ public WhereCondition like(String value) { return new PropertyCondition(this, " LIKE ?", value); } /** Creates an "BETWEEN ... AND ..." condition for this property. */ public WhereCondition between(Object value1, Object value2) { Object[] values = { value1, value2 }; return new PropertyCondition(this, " BETWEEN ? AND ?", values); } /** Creates an "IN (..., ..., ...)" condition for 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語句內容的。下面我們使用一些例子用來說明如何使用:
例1:查詢部門1中所有員工
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_orm架構之greenDAO(二)