2016-12-29 1 views
0

Selon ce poste: Multiple, combined OR conditions in ORMLitemultiples ou déclarations contenues dans ORMLite

Je veux faire des requêtes qui peuvent dépendre ArrayList de la condition et des chaînes en fonction

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

Mais Ive a obtenu jeter de l'application sans exception à chaque fois que la première itération de boucle est terminée

MISE À JOUR: Je résous mon problème. solution était:

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

"Jeté hors application". Euh Vous voulez dire que la JVM a démissionné de vous? Si votre application s'est arrêtée alors il y a des chances qu'il y ait eu une exception. – Gray

Répondre

0

Mais j'ai jeter l'application sans exception chaque fois que la première itération de la boucle est terminée

Ok, d'abord, à moins que la machine virtuelle Java quitter sur vous là-bas était une exception, juste qu'il n'a pas été correctement attrapé ou connecté en quelque sorte. Si vous activez la journalisation, je suppose que l'exception aurait expliqué le problème.

Il existe un certain nombre de problèmes avec votre code. Je ne suis pas sûr lequel (ou quelque chose d'autre) provoque l'exception à jeter. Le premier problème est:

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

La solution est d'ajouter ici que les OR s si le filterOn est réglé. Sinon, vous auriez généré une requête invalide. Je recommande toujours d'utiliser {} afin que vous puissiez voir ce genre de problèmes. Je fais un appel à where.or(...) avec la taille * 2 pour le category et name.

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

Donc, cela semble être ajouter les category et name équivaut à des comparaisons en tant que bien. Si filterOn et !searchBar.isEmpty() peut être vrai en même temps, alors vous obtiendrez des entrées WHERE en double qui sont inefficaces. Toutefois, il peut également générer une requête incomplète car si vous ajoutez un nombre de OR entrées correspondant à la catégorie/nom et que vous le faites à nouveau, vous avez besoin d'un OR supplémentaire pour lier les deux ensembles. Par exemple:

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 

Ce code générerait une exception de requête non valide parce que vous manquez le dernier OR qui lie les deux ensembles de comparaisons ensemble.

Ce que je recommande est de compter le nombre de ORs ajoutés à la requête:

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

Cela mettra le nombre approprié de ORs dans votre requête à la fin.

Couple autres commentaires:

  • cat devraient être cats au moins pour montrer qu'il est le stockage multiple. Idem pour line.
  • Envisagez d'utiliser le type for (String cat : cats) de for au lieu d'utiliser for (int i = 0; ...) { ... cats.get(i) ... }.Le premier type est moins sujet aux erreurs avec le compteur.
+0

Je résous mon problème mais merci pour vos conseils! – Expiredmind