Android使用GreenDao进行动态查询时,有时候需要查询参数是动态,尤其一些情况下参数个数还不确定,这时候需要使用动态查询方法。如下面例子所示,查询条件conditions是一个string数组,具体长度不定,所以使用for循环来拼接查询条件。具体的方法就是将查询条件的list转成Array数组,然后利用querybuild的where和whereOr方法来拼接条件。如下所示。
public List<XXXX> query(int days, int number, String[] conditions) {
QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;
QueryBuilder<XXXXX> queryBuilder = daoManager.getDaoSession().getXXXXDao().queryBuilder();
List<WhereCondition> whereConditions = new ArrayList<>();
whereConditions.add(XXXXXDao.Properties.Days.eq(days));
whereConditions.add(XXXXXDao.Properties.Number.eq(number));
for (String condition: conditions) {
if (condition== null) {
break;
}
whereConditions.add(DiagnosisDao.Properties.Condition.like("%" + condition+ "%"));
}
WhereCondition[] conditionsArray = new WhereCondition[whereConditions.size()];
conditionsArray = whereConditions.toArray(conditionsArray);
QueryBuilder queryBuilder1 = where(queryBuilder, conditionsArray);
List<XXXX> XXXXList= queryBuilder1.list();
return XXXXList;
}
public static QueryBuilder where(QueryBuilder queryBuilder, WhereCondition[] whereConditions) {
if (whereConditions == null) return queryBuilder.where(null);
else if (whereConditions.length == 1) return queryBuilder.where(whereConditions[0]);
else {
QueryBuilder where = queryBuilder.where(whereConditions[0], Arrays.<WhereCondition>copyOfRange(whereConditions, 1, whereConditions.length));
return where;
}
}
以上query函数中的XXX需要替换成实际的数据库Dao和bean类。
注意:在where函数中,如果使用
queryBuilder.whereOr函数,那么后面需要三个参数,详细可以见QueryBuild类中的定义。
qb.whereOr(conditionsArray[0], conditionsArray[1], Arrays.copyOfRange(conditionsArray, 2, conditionsArray.length);