QueryBuilder ormlite给出了错误的结果

时间:2015-02-06 10:03:40

标签: android sql nested ormlite query-builder

创建一个支持SEARCH功能的活动,其中包含多个组合选项供用户选择。因此,用户在组合搜索字段中选择某些选项,正确的参数应该通过显示正确的结果列表。

然而,搜索结果是错误的。我实际上正在使用QueryBuilder:使用' AND'和'或者'逻辑。我所意识到的是,在日志中,' AND'和'或者'混淆了。显示以下日志:

  

02-06 17:29:15.891:I / -------------------- PropertySearchActivity --------------- -----(31850):SELECT * FROM property WHERE(((({propertyCity LIKE' China' OR propertyCountry LIKE' China&# 39;)和propertyName LIKE' %%')和propertyType LIKE' Office')或propertyType2 LIKE' Office&# 39;或propertyType3喜欢'办公室')和propertyVisibility ='已发布')订购propertyName

如日志中所示,有多个'('之后' WHERE',之前' propertyCity'其次,我需要' ('在OR语句前面,以便正确的日志应该是:

  

02-06 17:29:15.891:I / -------------------- PropertySearchActivity --------------- -----(31850):SELECT * FROM property WHERE(propertyCity LIKE' China' OR propertyCountry LIKE' China')AND propertyName喜欢' %%' AND propertyType LIKE' Office'或propertyType2 LIKE' Office' OR propertyType3 LIKE' Office& #39; propertyVisibility ='已发布' ORDER BY propertyName

我已附上以下代码供您阅读,请协助。谢谢。

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

2 个答案:

答案 0 :(得分: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")
                );
        }

答案 1 :(得分:0)

首先,您无法使用==!=来查看String是否具有与其他String相同的内容,您应该使用equals(...) } 方法。 String ==与另一个String的唯一方法是,如果它们是同一个对象。

但是ORMLite似乎确实存在一个错误。当我把你的查询归结为你时,你正在做:

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

将“in-fix”查询表单(and())与参数查询表单(or(1 ,2))结合起来非常奇怪。如果您希望将and()视为单个实体,则第一个or(4)内的or(4, 5, 6)会弹出。{/ p>

我会看到修复ORMLite是多么容易。

感谢。