我需要验证一些创建完整查询的条件:
QueryBuilder qb = getMyObjDao()。queryBuilder();
if(someCondition)
qb.where(MyObjDao.Properties.Prop1.eq(someValue));
否则
qb.whereOr(MyObjDao.Properties.Prop2.eq(someValue中),MyObjDao.Properties.Prop2.eq(someValue中));if(someOtherCondition)
qb.where(MyObjDao.Properties.Prop3.eq(someValue));
否则
qb.whereOr(MyObjDao.Properties.Prop4.eq(someValue));
那么是否可以连接查询构建器条件并动态创建查询构建器? 或其他任何事情:
(a ='%'+ condition1或a ='%'+ condition1 +'%'或a = condition1 +'%')和
|(b ='%'+ condition2或b ='%'+ condition2 +'%'或b = condition2 + '%')和....
如何在greenDao中制作?
答案 0 :(得分:5)
QueryBuilder.and()
和QueryBuilder.or()
用于合并WhereCondition
。
生成的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有很多可能性。但是,只要你没有给出你真正想要做的详细的例子和描述,没有人可以帮助你。
顺便说一下:
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 '%'+condition1
或a like condition1+'%'
的每个结果也会匹配a like '%'+condition1+'%'
。