在 greenDAO 中使用 WHERE OR 选择多个元素的简单解决方案?

Simple solution for selecting multiple elements using WHERE OR in greenDAO?

我有一个主键列表,我需要从我的 greendao 数据库中获取这些元素。

最简单的方法是分别查询每个对象并将其插入到列表中:

public List<MyObject> getMyObjectByIds(List<String> ids) {
    List<MyObject> result = new ArrayList<MyObject>();

    for (String id : ids) {
        QueryBuilder<MyObject> queryBuilder = myObjectDao.queryBuilder();
        MyObject myObject = queryBuilder.where(MyObjectDao.Properties.Id.eq(id)).unique();
        result.add(myObject);
    }

    return result;
}

然而,这似乎非常无效,因为它必须执行 ids.size() 查询。具有多个 OR 语句的单个查询会更好。但是,由于 whereOr() and or() 方法只有 2 个或更多参数除外,因此您必须进行相当多的 IF ELSE 语句才能捕获具有 0、1 或 2 个 ID 的列表:

public List<MyObject> getMyObjectByIds(List<String> ids) {
    QueryBuilder<MyObject> queryBuilder = myObjectDao.queryBuilder();

    if (ids.size() == 0) {
        List<MyObject> result = new ArrayList<MyObject>();
        return result;
    } else if (ids.size() == 1) {
        return queryBuilder.where(MyObjectDao.Properties.Id.eq(ids.get(0))).list();
    } else if (ids.size() == 2) {
        queryBuilder.whereOr(MyObjectDao.Properties.Id.eq(ids.get(0)), MyObjectDao.Properties.Id.eq(ids.get(1)));
        return queryBuilder.list();
    } else if (ids.size() >= 3) {
        queryBuilder.whereOr(MyObjectDao.Properties.Id.eq(ids.get(0)), MyObjectDao.Properties.Id.eq(ids.get(1)), getWhereConditionsEqIdRefFromThirdElementOn(ids));
        return queryBuilder.list();
    }
}

private WhereCondition[] getWhereConditionsEqIdFromThirdElementOn(List<String> ids) {
    WhereCondition[] whereConditions = new WhereCondition[ids.size() - 1];
    for (int i = 2; i < ids.size(); ++i) {
        whereConditions[i] = MyObjectDao.Properties.Id.eq(ids.get(i));
    }
    return whereConditions;
}

老实说,这可能会更快,但对我来说仍然很难看。还有别的办法吗?还是我必须进行原始查询?

我可能遗漏了一些东西,但这看起来像是使用 in operator 的书本示例。

您可以尝试这样做:

public List<MyObject> getMyObjectByIds(List<String> ids) {

    List<MyObject> result = new ArrayList<MyObject>();
    QueryBuilder<MyObject> queryBuilder = myObjectDao.queryBuilder();
    for (String id : ids) {
        queryBuilder.whereOr(MyObjectDao.Properties.Id.eq(id));
    }

    return queryBuilder.list();
}

根据文档 here,似乎每个 whereOr 函数都使用逻辑 OR 将给定条件添加到前一个 where 子句。可能需要在 for.

之前添加一个初始 where 子句

正如 Dragon Bozanovic 指出的那样。 GreenDAO 确实有用于此目的的 IN 运算符。

public List<MyObject> getMyObjectByIds(List<String> ids) {
    return myObjectDao.queryBuilder()
             .where(MyObjectDao.Properties.Id.in(ids)).list();
}