greendao源码分析:QueryBuilder

QueryBuilder是什么?

1. 为什么要使用QueryBuilder?
针对实体的查询,你的查询条件可能多种多样,这时候你可以利用QueryBuilder来指定查询条件。它会根据你指定的查询条件去创建sql语句。

2. 如何使用QueryBuilder?
通过实体的 dao类来获得。

List  joes = dao.queryBuilder()
.where(Properties.FirstName.eq("Joe")).orderAsc(Properties.LastName).list(); 

切入分析

一个使用例子:

List listPointAll = GreenC.getPointDao().queryBuilder().
                where(PointDao.Properties.Pk_TagId.eq(mTag.getId()),
                        PointDao.Properties.GroupSnCode.eq(groupSnCode)).
                orderAsc(PointDao.Properties.SnCode).list();
  1. 创建 QueryBuilder:
    GreenC.getPointDao().queryBuilder()

通过dao类来创建qb


greendao源码分析:QueryBuilder_第1张图片
  1. 指定where条件:
    where(PointDao.Properties.Pk_TagId.eq(mTag.getId()),PointDao.Properties.GroupSnCode.eq(groupSnCode)).

将where条件加入到 whereCollector

greendao源码分析:QueryBuilder_第2张图片

  1. 指定排序的属性:
    将排序的条件加入到orderBuilder

    greendao源码分析:QueryBuilder_第3张图片

  2. 构建sql语句:


    greendao源码分析:QueryBuilder_第4张图片

由以上几个流程可知,你提供几个条件,最终QueryBuilder进行build,提供sql语句,然后交给Query来执行。所以我们要好好考虑build了。

核心 build

greendao源码分析:QueryBuilder_第5张图片
  1. createSelectBuilder():
private StringBuilder createSelectBuilder() {
        // 1. 创建 sql 语句
        String select = SqlUtils.createSqlSelect(dao.getTablename(), tablePrefix, dao.getAllColumns(), distinct);
        StringBuilder builder = new StringBuilder(select);

        // 2. 添加 join 和 where
        appendJoinsAndWheres(builder, tablePrefix);

        // 3. 添加 order by
        if (orderBuilder != null && orderBuilder.length() > 0) {
            builder.append(" ORDER BY ").append(orderBuilder);
        }
        return builder;
    }

// 1. 创建sql语句
SqlUtils是个工具类,提供便捷的方法去创建sql语句!
详情,请看:SqlUtils
// 2. 添加join和where语句

greendao源码分析:QueryBuilder_第6张图片

  1. checkAddLimit()


    greendao源码分析:QueryBuilder_第7张图片
  2. checkAddOffset()


    greendao源码分析:QueryBuilder_第8张图片

结束~
sql语句,数值,limit与offset的位置都有了,把他们交给Query,让query来解决数据的加载问题!

你可能感兴趣的:(greendao源码分析:QueryBuilder)