4

完全なクエリを作成するには、いくつかの条件を確認する必要があります。

QueryBuilder qb = getMyObjDao().queryBuilder();

if (何らかの条件)

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

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

if (その他の条件)

 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でそれをどのように行うのですか?

4

1 に答える 1

6

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 '%'+condition1a like condition1+'%'a like '%'+condition1+'%'
于 2013-10-28T06:19:40.463 に答える