使用ORMlite OR子句的异常

Gar*_*Bak 1 android ormlite

我有一段时间试图在ORMLite中使用'或'子句,我得到以下例外:

Caused by: java.lang.IllegalStateException: Expecting there to be a clause already defined for 'OR' operation
            at com.j256.ormlite.stmt.Where.pop(Where.java:702)
            at com.j256.ormlite.stmt.Where.or(Where.java:381)
Run Code Online (Sandbox Code Playgroud)

我已搜索周围RTFM,但我不能完全明白我在做什么错.我查看了抛出异常的行,看起来堆栈是空的,当它期待某些东西存在时.

我尝试过更改一下查询,以下三个示例如下:

List<Contacts> list = new ArrayList<Contacts>();

Dao<Contacts,Integer> dao = DatabaseManager.getInstance().getDaoForClass(Contacts.class);
final QueryBuilder<Contacts, Integer> queryBuilder = dao.queryBuilder();

nameFilter = "%" + nameFilter + "%";
// Tried this way:
queryBuilder.where().or(queryBuilder.where().like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter),
                        queryBuilder.where().like(Contacts.FIELD_NAME_LAST_NAME, nameFilter),
                        queryBuilder.where().like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter));

// And then this way:
queryBuilder.where().like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
queryBuilder.where().or();
queryBuilder.where().like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
queryBuilder.where().or();
queryBuilder.where().like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);

// And this way
queryBuilder.where().like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
queryBuilder.where().like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
queryBuilder.where().like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
queryBuilder.where().or(3);

queryBuilder.orderByRaw(Contacts.FIELD_NAME_LAST_NAME + "  COLLATE NOCASE, " + Contacts.FIELD_NAME_FIRST_NAME + " COLLATE NOCASE");
list = queryBuilder.query();
Run Code Online (Sandbox Code Playgroud)

我该如何编写这个简单的查询?

Gra*_*ray 7

你有答案,但我想我会为后代添加更多细节.该QueryBuilder.where()方法Where每次都会生成一个新对象.ORMLite抛出一个异常,因为它只看到最后一个where()方法调用,它是:

queryBuilder.where().or(3);
Run Code Online (Sandbox Code Playgroud)

所以它没有看到任何其他like(...)方法调用,因为它们是在不同的Where对象上进行的.

如果查看构建查询文档,可以看到该模式只调用where() 一次,然后使用该Where对象构建SQL WHERE子句:

Where where = queryBuilder.where();
where.or(where.like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter),
         where.like(Contacts.FIELD_NAME_LAST_NAME, nameFilter),
         where.like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter));
Run Code Online (Sandbox Code Playgroud)

要么:

Where where = queryBuilder.where();
where.like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
where.or();
where.like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
where.or();
where.like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
Run Code Online (Sandbox Code Playgroud)

要么:

Where where = queryBuilder.where();
where.like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
where.like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
where.like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
where.or(3);
Run Code Online (Sandbox Code Playgroud)


Gar*_*Bak 5

正如@Selvin评论的那样,这修复了它:

Where where = queryBuilder.where();

where.like(Contacts.FIELD_NAME_FIRST_NAME, nameFilter);
where.like(Contacts.FIELD_NAME_LAST_NAME, nameFilter);
where.like(Contacts.FIELD_NAME_PHONE_NUMBER, nameFilter);
where.or(3);
Run Code Online (Sandbox Code Playgroud)