根据这篇文章: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());
答案 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(...)
,category
和name
的尺寸*为if(searchBar.size()!=0){
。
category
所以这似乎也在添加name
和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);
。
我建议的是计算添加到查询中的OR数:
cat
这将在最后将适当数量的OR放入您的查询中。
结合其他评论:
cats
至少应为line
,以表明它正在存储多个。 for (String cat : cats)
。for
类型for (int i = 0; ...) { ... cats.get(i) ... }
而不是request.Headers.Expires = DateTime.Now.AddMinutes(2);
。第一种类型不太容易出现计数器错误。