2015-02-06 3 views
0

Создайте объект, который поддерживает функции поиска с несколькими вариантами комбинации для выбора пользователями. Следовательно, пользователи выбирают определенные параметры в поле поиска комбинации, правильный параметр должен проходить через отображение правильных списков результатов.QueryBuilder ormlite дает неверный результат

Однако результаты поиска неверны. Я фактически использую QueryBuilder: используя логику «AND» и «OR». Я понял, что в журнале последовательность «И» и «ИЛИ» смешивается. Показан следующий журнал:

02-06 17: 29: 15.891: I/-------------------- PropertySearchActivity ------ -------------- (31850): SELECT * FROM property WHERE ((((propertyCity LIKE 'China' OR propertyCountry LIKE 'China') И propertyName LIKE '%%') И propertyType LIKE 'Офис') OR propertyType2 LIKE 'Офис' ИЛИ ​​propertyType3 LIKE 'Офис') И propertyVisibility = 'Опубликовано') ORDER BY propertyName

Как видно в журнале, есть несколько '(' после 'WHERE' , прежде чем «propertyCity», во-вторых, мне нужно '(' перед инструкциями OR, чтобы правильный журнал должен быть:

02-06 17: 29: 15.891: I/---------------- ---- PropertySearchActivity -------------------- (31850): SELECT * FROM property WHERE (propertyCity LIKE 'China' OR LIKE 'China') И propertyName LIKE '%%' И (propertyType КАК 'Офис' ИЛИ ​​propertyType2 LIKE 'Офис' ИЛИ ​​propertyType3 LIKE 'Офис' ) И propertyVisibility = 'Издатель' ORDER BY propertyName

Я приложил следующий код для вашего прочтения, pls assist. Спасибо.

try { 
     List<DbClassProperty> ls; 
     QueryBuilder<DbClassProperty, Integer> qb = ((RootActivity) getContext()) 
       .getHelper().getDbClassPropertyDao().queryBuilder(); 

     qb.orderBy("propertyName", true); 

     Where<DbClassProperty, Integer> wb = ((RootActivity) getContext()) 
       .getHelper().getDbClassPropertyDao().queryBuilder().where(); 

     if (countrySpin.getSelectedItem().toString() != "Country.City"){ 


      wb.and(
        wb.or (
        wb.like("propertyCity", countrySpin.getSelectedItem().toString()), 
        wb.like("propertyCountry", countrySpin.getSelectedItem().toString()) 
        ), 

        (wb.like("propertyName","%" + nameEdit.getText().toString() + "%") 
        ) 
       ); 
     }else 

      wb.like("propertyName", "%" + nameEdit.getText().toString()+ "%"); 

     if (typeSpin.getSelectedItem().toString() != " Type") { 

      wb.and() 
        .or(

        wb.like("propertyType", typeSpin.getSelectedItem() 
          .toString()), 
        wb.like("propertyType2", typeSpin.getSelectedItem() 
          .toString()), 
        wb.like("propertyType3", typeSpin.getSelectedItem() 
          .toString()) 
        ); 
     } 

     wb.and().eq("propertyVisibility", "Published"); 
+0

Вы не можете использовать '==' и '! =' Со строками. Вам нужно использовать '.equals()'. – Gray

ответ

0

Решено:

if (countrySpin.getSelectedItem().toString() != "Country.City"){ 


      wb.and(
        wb.or (
        wb.like("propertyCity", countrySpin.getSelectedItem().toString()), 
        wb.like("propertyCountry", countrySpin.getSelectedItem().toString()) 
        ), 

        (wb.like("propertyName","%" + nameEdit.getText().toString() + "%") 
        ) 
       ); 
     }else 

      wb.like("propertyName", "%" + nameEdit.getText().toString()+ "%"); 

     if (typeSpin.getSelectedItem().toString() != " Type") { 
      wb.and(
        wb.or (
          wb.like("propertyType", typeSpin.getSelectedItem() 
            .toString()), 
          wb.like("propertyType2", typeSpin.getSelectedItem() 
            .toString()), 
          wb.like("propertyType3", typeSpin.getSelectedItem() 
            .toString()) 
        ), 
        wb.and().eq("propertyVisibility", "Published") 
       ); 
     } 
+0

Вы не можете использовать '==' и '! =' Со строками. Вам нужно использовать '.equals()'. – Gray

+0

@Gray Какая альтернатива для! =? – androidnoob

+0

'! .equals() 'так что-то вроде'! typeSpin.getSelectedItem(). toString(). equals ("Type") ' – Gray

0

Во-первых, вы не можете использовать == и !=, чтобы увидеть, если String имеет то же содержание другого String, вы должны использовать equals(...) метод. Единственный способ: String - == другому String - если это тот же самый объект.

Но здесь, похоже, есть ошибка в ORMLite. Как я сводиться ваш запрос, вы делаете:

and(or(1, 2), 3) 
and().or(4, 5, 6); 
and().7 

Это очень странно сочетать «в-FIX» формы запроса (and()) с формами аргумент запроса (or(1 ,2)). Исправлена ​​ошибка and() с первого or(4), когда вы ожидали, что она обработает or(4, 5, 6) как единое целое.

Я посмотрю, как легко это исправить в ORMLite.

Спасибо.

+0

вы имеете в виду что-то вроде: if (countrySpin.getSelectedItem(). ToString() .equals ("Country.City")) 'вместо' if (countrySpin.getSelectedItem(). ToString()! = "Country.City") '?? – androidnoob

+0

на самом деле больше (((1 ИЛИ 2 ИЛИ 3) И (4)) И ((5 ИЛИ 6 ИЛИ 7) И (8))), поэтому есть два основных параметра, которые необходимо выполнить – androidnoob

Смежные вопросы