1

我需要添加一些or子句来查询。我需要循环执行。

StringTokenizer st = new StringTokenizer(symptoms, ",");
while(st.hasMoreTokens()){
     qb.whereOr(Properties.Symptom.like("%" + st.nextToken() + "%"));
}

我怎样才能or正确添加这些条件,因为上面没有按预期工作。我想or为每个症状添加。

4

3 回答 3

4

如果您查看文档,您会发现它whereOr()需要无限数量的条件。您想要做的是一次将它们全部添加到一个数组中:

StringTokenizer st = new StringTokenizer(symptoms, ",");

ArrayList<WhereCondition> whereConditions = new ArrayList<WhereCondition>();

while(st.hasMoreTokens()){
     whereConditions.add(Properties.Symptom.like("%" + st.nextToken() + "%"));
}

// Give the ArrayList an already allocated array to place its contents in.
WhereCondition[] conditionsArray = new WhereCondition[whereConditions.size()];
conditionsArray = whereConditions.toArray(conditionsArray);

qb.whereOr(conditionsArray);

看起来文档中的方法调用需要两个非数组 WhereConditions,然后是一个椭圆形参数,它接受一个数组或一个额外的逗号分隔的对象列表。因此,您可能必须执行以下操作才能使其正常工作:

qb.whereOr(conditionsArray[0], conditionsArray[1], Arrays.copyOfRange(conditionsArray, 2, conditionsArray.length));

附录:看起来您使用的 API 与文档不匹配,可能是 greenDAO 的旧版本。我根据当前文档编写了这个解决方案。我不能保证它会为你工作。如果可能,我建议更新。

于 2013-05-16T10:36:48.817 回答
0

尝试这个:

StringTokenizer st = new StringTokenizer(symptoms, ",");
WhereCondition where = null;
while(st.hasMoreTokens()){
    if (where != null) {
        where = qb.or(where, Properties.Symptom.like("%" + st.nextToken() + "%"));
    } else {
        where = Properties.Symptom.like("%" + st.nextToken() + "%");
    }
}
qb.where(where).list();
于 2013-11-04T10:48:19.333 回答
0

我遇到了同样的问题,因此我在 Util 类中添加了自己的方法,以在数组中有一个或多个 WhereCondition 时执行相同的行为。

这是我的网关方法:

public static QueryBuilder whereOr(QueryBuilder queryBuilder, WhereCondition[] whereConditions){
        if(whereConditions == null) return queryBuilder.where(null);
        else if(whereConditions.length == 1) return queryBuilder.where(whereConditions[0]);
        else return queryBuilder.whereOr(whereConditions[0], whereConditions[1], Arrays.copyOfRange(whereConditions, 2, whereConditions.length));
    }

利用 :Util.whereOr(queryBuilder, whereConditionsArray);

默认值:不能通过这种方法使用 QueryBuilder 中的 Builder 模式

(稍后更多)在这里,我分享一些代码,可以在开发DAO方法时节省您的时间。

public class QueryBuilderUtil {
    public static final String EQ = "=?";
    public static final String NOTEQ = "<>?";
    public static final String LIKE = " LIKE ?";
    public static final String GE = ">=?";
    public static final String LE = "<=?";
    public static final String GT = ">?";
    public static final String LT = "<?";


    public static QueryBuilder whereOrOnSamePropertyWithDifferentValues(QueryBuilder queryBuilder, Property property, String operation, String values, String separator) {
        return whereOrOnSamePropertyWithDifferentValues(queryBuilder, property, operation, values.split(separator));

    }

    public static QueryBuilder whereOrOnSamePropertyWithDifferentValues(QueryBuilder queryBuilder, Property property, String operation, String[] values) {
        WhereCondition[] whereConditions = new WhereCondition[values.length];
        int i = 0;
        for (String value : values) {
            whereConditions[i++] = new WhereCondition.PropertyCondition(property, operation, value);
        }
        return whereOr(queryBuilder, whereConditions);
    }

    public static QueryBuilder whereOr(QueryBuilder queryBuilder, WhereCondition[] whereConditions) {
        if (whereConditions == null) return queryBuilder.where(null);
        else if (whereConditions.length == 1) return queryBuilder.where(whereConditions[0]);
        else return queryBuilder.whereOr(whereConditions[0], whereConditions[1], Arrays.copyOfRange(whereConditions, 2, whereConditions.length));
    }
} 

使用此类,您可以在一行中对多个“值字符串”执行具有相同属性的 whereOr。有必要清理我的代码:)。但是,您只能执行简单的操作,例如在类中声明的变量。

例子 :

public List<Block> loadAllByModId(String mods_id) {
        synchronized (this) {
            QueryBuilder<Block> queryBuilder = queryBuilder();
            QueryBuilderUtil.whereOrOnSamePropertyWithDifferentValues(queryBuilder, Properties.ModId, QueryBuilderUtil.EQ, mods_id, ";");
            query_list = queryBuilder.build();
        }
        Query<Block> query = query_list.forCurrentThread();
        return query.list();
    } 

希望能帮助到你

于 2015-05-27T14:01:33.083 回答