android_orm框架之greenDAO(二)


一、概述

  在上次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();

 

作者: 傑瑞教育
出處: http://www.cnblogs.com/jerehedu/ 
本文版權歸煙台傑瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM