ActiveAndroid:使用Collection作为参数进行查询

时间:2016-01-26 19:16:14

标签: android activeandroid

我希望传递一组ID以获取与这些ID匹配的实体列表。这似乎不起作用:

public static List<Program> getByIds(Collection<Integer> ids) {
    return new Select().from(Program.class)
        .where("programId in (?)", ids)
        .execute();
}
当我知道我在集合中有两个ID时,

也不是这样:

public static List<Program> getByIds(Collection<Integer> ids) {
    return new Select().from(Program.class)
        .where("programId in (?,?)", ids)
        .execute();
}

我什么都没回来。没有错误。程序实体确实存在,因为我已经完成了选择没有位置并打印了退回的项目&#39; IDS。

必须将整数ID转换为字符串,然后转换为连接字符串以便在where子句中使用,这似乎是重新发明轮子。当然,还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

呃,这就是我所拥有的,但似乎很奇怪每个想要使用ActiveAndroid的人都必须这样做才能使用'in':

public static List<Program> getByIds(Collection<Integer> ids) {
    return new Select().from(Program.class)
        .where("programId in " + DAOUtil.makePlaceholders(ids.size()),
            ids.toArray(new Integer[ids.size()]))
        .execute();
}

可以找到makePlaceholders:

IN clause and placeholders

答案 1 :(得分:0)

尝试给它一个数组而不是一个集合,因为在ActiveAndroid的源代码中,它需要一个对象数组

in where()

public From where(String clause, Object... args) {
    where(clause).addArguments(args);
    return this;
}

深入了解......

void addArguments(Object[] args) {
    for(Object arg : args) {
        if (arg.getClass() == boolean.class || arg.getClass() == Boolean.class) {
            arg = (arg.equals(true) ? 1 : 0);
        }
        mArguments.add(arg);
    }
}

这应该有希望解决你的问题