QueryBuilder.and()
とsQueryBuilder.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 と 2 番目のステートメントは廃止されました。
もう 1 つの例は(a = '%'+condition1 or a = '%'+condition1+'%' or a = condition1 + '%') and (b = '%'+condition2 or b = '%'+condition2+'%' or b = condition2 + '%') and ....
、文字列を検索していない場合%
、このような where 句を含むクエリは、何も返さないか、または 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()
WhereCondition を 1 つだけ使用している場合は、 orを使用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+'%'