2016-12-29 9 views
0

内の複数のORステートメント:Multiple, combined OR conditions in ORMLiteこの記事によるとORMLite

私は機能に

List<String> cat = new ArrayList<String>(); 
List<Person> line = new ArrayList<>(); 
Dao<Person, Integer> personDAO = getHelper().getPersonDAO(); 
cat.add("category1"); 
cat.add("category2"); 
QueryBuilder<Person, Integer> queryBuilder = personDAO.queryBuilder(); 
Where<Person, Integer> where = queryBuilder.where(); 

if(filterOn) 
    for (int i = 0; i < cat.size(); ++i) 
     where.eq("category", cat.get(i)).or().eq("name", cat.get(i)); 
where.or(cat.size()); 

if(searchBar.size()!=0){ 
    for (int i = 0; i < cat.size(); ++i) 
     where.eq("category", cat.get(i)).or().eq("name", cat.get(i)); 
    where.like("category", constrainName).or().like("name", constrainName); 
    where.or(cat.size()+1); 
} 
line = personDAO.queryBuilder().query(); 

を条件と文字列のArrayListに依存することができるクエリを作成したいが、アイブ氏は、あらゆることなく、アプリケーションの外に投げてしまいましたループの最初の繰り返しが終了するたびに例外が発生します。

更新:問題を解決します。

for (int i = 0; i < cat.size(); ++i) 
    where.eq("category",cat.get(i)).or().eq("name",cat.get(i)); 
where.or(cat.size()); 

if(data){ 
    where.like("category", t).or().like("name", t); 
    l = personDAO.query(where.and(2).prepare()); 
} else 
    l = personDAO.query(where.or(1).prepare()); 
+0

"適用外です"。ああ。あなたはJVMがあなたを辞めたことを意味しますか?アプリケーションが停止した場合、例外があります。 – Gray

答えて

0

しかし、私はJVMがあなたに終了しない限り、ループの最初の反復は、最初のオフ、

[OK]を終了するたびに例外なしにアプリケーションからスローを持っている:ソリューションでした例外で、ちょうどそれが適切に捕らえられなかったか、何とかログに記録されていませんでした。ロギングを有効にすると、例外が問題を説明していると思われます。

コードにはいくつかの問題があります。私はどちらか(または何か)が例外がスローされているか分からない。最初の問題は、次のとおりです。ここ

if (filterOn) { 
    for (String entry : cat) { 
     where.eq("category", entry); 
     where.eq("name", entry); 
    } 
    where.or(cat.size() * 2); 
} 

修正がfilterOnが設定されている場合にのみOR秒を追加することです。そうしないと、無効なクエリが生成されます。私は常に{}を使用することをお勧めします。そうすれば、これらの種類の問題を見ることができます。 categorynameのサイズが* 2のwhere.or(...)を1回呼び出します。

if(searchBar.size()!=0){ 

だから、これはcategoryname同様に、equalsの比較を追加しているようです。 filterOn!searchBar.isEmpty()が同時に真である場合は、WHEREのエントリが重複していると効率的ではありません。ただし、カテゴリ/名前に一致するORエントリの数を追加して再度実行すると、2つのセットをリンクするためにさらに1つのORが必要になるため、不完全なクエリも生成される可能性があります。たとえば、次のように

if (filterOn) { 
    where.eq("category", entry); 
    where.eq("name", entry); 
    where.or(2); 
} 
if (!searchBar.isEmtpy()) { 
    where.eq("category", entry); 
    where.eq("name", entry); 
    where.like("category", entry); 
    where.like("name", entry); 
    where.or(4); 
} 
// MISSING LAST OR HERE if both conditions are true 

あなたが一緒に比較の二組を結びつける最後ORが不足しているため、このコードは、無効なクエリの例外を生成します。私が推薦する何

は、クエリに追加ORの数を数えることである。

int orCount = 0; 
if (filterOn) { 
    // loop here 
    for loop { 
     where.eq("category", entry); 
     where.eq("name", entry); 
     orCount += 2; 
    } 
} 
if (!searchBar.isEmtpy()) { 
    for loop { 
     where.eq("category", entry); 
     where.eq("name", entry); 
     orCount += 2; 
    } 
    where.like("category", entry); 
    where.like("name", entry); 
    orCount += 2; 
} 
where.or(orCount); 

これが最後で、あなたのクエリにORの適切な数を配置します。

カップル他のコメント:

  • catは、少なくとも、それは、複数のを記憶していることを示すためにcatsでなければなりません。 lineと同じです。
  • for (int i = 0; ...) { ... cats.get(i) ... }の代わりにforfor (String cat : cats)タイプを使用することを検討してください。第1のタイプは、カウンタの誤差が少ない。
+0

私は私の問題を解決するが、あなたのヒントのおかげで! – Expiredmind

関連する問題