ORMLite中的多个OR语句

时间:2016-12-29 14:55:16

标签: android sqlite where-clause ormlite query-builder

根据这篇文章:Multiple, combined OR conditions in 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();

但是,当循环的第一次迭代完成时,我已经没有任何异常地退出应用程序

更新:我解决了我的问题。解决方案是:

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

1 个答案:

答案 0 :(得分:0)

  

但是,无论何时第一次循环迭代完成,我都会抛出应用程序而没有任何异常

好的,首先,除非JVM退出,否则会出现异常,只是它没有被正确捕获或以某种方式记录。如果启用日志记录,我怀疑异常会解释问题。

您的代码存在许多问题。我不确定哪一个(或其他东西)导致异常被抛出。第一个问题是:

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

此处的修复是仅在设置OR时添加filterOn s。否则,您将生成无效查询。我建议始终使用{},以便您可以看到这些问题。我拨打where.or(...)categoryname的尺寸*为if(searchBar.size()!=0){

category

所以这似乎也在添加namefilterOn等于比较。如果!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);

我建议的是计算添加到查询中的OR数:

cat

这将在最后将适当数量的OR放入您的查询中。

结合其他评论:

  • cats至少应为line,以表明它正在存储多个。 for (String cat : cats)
  • 也是如此
  • 考虑使用for类型for (int i = 0; ...) { ... cats.get(i) ... }而不是request.Headers.Expires = DateTime.Now.AddMinutes(2); 。第一种类型不太容易出现计数器错误。