gpt4 book ai didi

android - 使用 ORMlite OR 子句的异常

转载 作者:行者123 更新时间:2023-11-29 14:21:33 26 4
gpt4 key购买 nike

我在尝试在 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)

我搜索了 aroundRTFM ,但我不太明白我做错了什么。我查看了抛出异常的行,当它期望有东西存在时,堆栈似乎是空的。

我尝试稍微改变一下查询,下面是所有三个示例:

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

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

最佳答案

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

queryBuilder.where().or(3);

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

如果您查看 building queries documentation您可以看到该模式是调用 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));

或者:

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

或者:

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

关于android - 使用 ORMlite OR 子句的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31481991/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com