我需要验证一些条件才能创建完整的查询:
querybuilder qb=getmyobjdao().querybuilder();
如果(某个条件)

 qb.where(MyObjDao.Properties.Prop1.eq(someValue));

其他的
qb.whereor(myobjdao.properties.prop2.eq(somevalue),myobjdao.properties.prop2.eq(somevalue));
如果(其他情况)
 qb.where(MyObjDao.Properties.Prop3.eq(someValue));

其他的
 qb.whereOr(MyObjDao.Properties.Prop4.eq(someValue));

那么,是否可以连接查询生成器条件并动态创建查询生成器?
或其他:
(a='%'+condition1或a='%'+condition1+“%”或a=condition1+“%”)和
|(B=“%”+条件2或B=“%”+条件2+“%”或B=条件2+
“%”)和….
绿岛怎么做的?

最佳答案

QueryBuilder.and()QueryBuilder.or()用于组合WhereConditions。
生成的WhereCondition必须在QueryBuilder.where()内部使用(它将使用AND组合条件)或QueryBuilder.whereOr()
请注意,你所有的问题都没有多大意义。因此,我给您的代码可能无法按您的预期工作,因为我只是猜测您的预期。
qb.whereOr(MyObjDao.Properties.Prop2.eq(someValue),MyObjDao.Properties.Prop2.eq(someValue))为例
这将转换为where (Prop2 = someValue OR Prop2 = someValue)where (Prop2 = 'someValue' OR Prop2 = 'someValue')。其中的or和第二个语句都是过时的。
另一个例子是(a = '%'+condition1 or a = '%'+condition1+'%' or a = condition1 + '%') and (b = '%'+condition2 or b = '%'+condition2+'%' or b = condition2 + '%') and ....
如果不搜索其中包含%的字符串,则包含这样的where子句的查询将返回none或false结果。
为:

(a = '%'+condition1 or a = '%'+condition1+'%' or a = condition1 + '%') and
(b = '%'+condition2 or b = '%'+condition2+'%' or b = condition2 + '%') and ....

你可以用这样的东西:
ArrayList<WhereCondition> and = new ArrayList<WhereCondition>();

if (condition1 != null) {
    and.add(queryBuilder.or(
            YourDao.Properties.a.eq("%"+condition1),
            YourDao.Properties.a.eq("%"+condition1+"%"),
            YourDao.Properties.a.eq(condition1+"%")));
}

if (condition2 != null) {
    and.add(queryBuilder.or(
            YourDao.Properties.a.eq("%"+condition2),
            YourDao.Properties.a.eq("%"+condition2+"%"),
            YourDao.Properties.a.eq(condition2+"%")));
}

...

if (and.size() == 1) {
    queryBuilder.where(and.get(0));
} else if (and.size() > 1) {
    WhereCondition first = and.remove(0);
    queryBuilder.where(first, and.toArray(new WhereCondition[and.size()]));
}

更新
当然,您也可以使用不带动态列表的另一种方法:
为:
QueryBuilder qb = getMyObjDao().queryBuilder();

if ( someCondition )

 qb.where(MyObjDao.Properties.Prop1.eq(someValue));

else
qb.whereOr(MyObjDao.Properties.Prop2.eq(someValue),MyObjDao.Properties.Prop2.eq(someValue));

if ( someOtherCondition )

 qb.where(MyObjDao.Properties.Prop3.eq(someValue));

else

 qb.whereOr(MyObjDao.Properties.Prop4.eq(someValue));

您可以使用:
QueryBuilder<MyObj> queryBuilder = getMyObjDao().queryBuilder();
WhereCondition where = null;

if (someCondition1) {
    WhereCondition cond = MyObjDao.Properties.Prop1.eq(someValue);
    if (where == null) {
        where = cond;
    } else {
        where = queryBuilder.and(where, cond);
    }
} else {
    WhereCondition cond = queryBuilder.or(
            MyObjDao.Properties.Prop2.eq(someValue),
            MyObjDao.Properties.Prop2.eq(someOtherValue));
    if (where == null) {
        where = cond;
    } else {
        where = queryBuilder.and(where, cond);
    }
}

if (someOtherCondition) {
    WhereCondition cond = MyObjDao.Properties.Prop3.eq(someValue);
    if (where == null) {
        where = cond;
    } else {
        where = queryBuilder.and(where, cond);
    }
} else {
    WhereCondition cond = MyObjDao.Properties.Prop4.eq(someValue);
    if (where == null) {
        where = cond;
    } else {
        where = queryBuilder.or(where, cond2);
    }
}

List<YourObj> result = queryBuilder.where(where).list();

正如您所看到的,有很多可能性可以在运行时使用greendao组合whereconditions。但只要你不给出一个详细的例子和你真正想做什么的描述,没有人能帮你。
顺便说一句:
如果您只使用一个wherecondition,那么使用where()whereOr()没有任何区别。
您可能想查询:(a like '%'+condition1 or a like '%'+condition1+'%' or a like condition1 + '%')而不是(a = '%'+condition1 or a = '%'+condition1+'%' or a = condition1 + '%')
注意,(a like '%'+condition1 or a like '%'+condition1+'%' or a like condition1 + '%')等于(a like '%'+condition1+'%'),因为每个匹配a like '%'+condition1a like condition1+'%'的结果也将匹配a like '%'+condition1+'%'

09-27 06:22