2016-12-29 56 views
0

語句根據這個帖子:Multiple, combined OR conditions in ORMLite多個或在ORMLite

我想製作能依賴的條件ArrayList和字符串函數

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(); 

但是Ive得到拋出的應用沒有任何疑問例外,只要第一次循環完成

更新:我解決了我的問題。解決辦法是:

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上,你不幹有是一個例外,只是它沒有正確捕獲或記錄。如果你啓用日誌記錄,我懷疑這個異常會解釋這個問題。

您的代碼有許多問題。我不確定哪一個(或別的東西)導致異常被拋出。第一個問題是:

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

的修復這裏是如果filterOn設置爲只添加OR秒。否則,你會產生一個無效的查詢。我建議您始終使用{},以便您可以看到這些類型的問題。我打了一個電話where.or(...),尺寸爲* 2的categoryname

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

因此,這似乎是在被添加categoryname equals比較爲好。如果filterOn!searchBar.isEmpty()可能同時爲真,那麼您將獲得效率低下的重複WHERE條目。但是,它也可能會生成不完整的查詢,因爲如果添加一些與類別/名稱匹配的OR條目,然後再次執行該操作,則需要再添加一個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這兩組比較的聯繫在一起這段代碼會產生一個無效的查詢例外。

我會建議是計數添加到查詢手術室的數量:

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); 

這將會把手術室的適當數量到你的查詢結尾。

情侶其他意見:

  • catcats至少表明它是存儲多個。 line一樣。
  • 考慮使用for (String cat : cats)類型的for而不是使用for (int i = 0; ...) { ... cats.get(i) ... }。第一種類型不太容易出現計數器錯誤。
+0

我解決了我的問題,但謝謝你的提示! – Expiredmind