Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用WHERE或in-greenDAO选择多个元素的简单解决方案?_Java_Android_Sqlite_Greendao - Fatal编程技术网

Java 使用WHERE或in-greenDAO选择多个元素的简单解决方案?

Java 使用WHERE或in-greenDAO选择多个元素的简单解决方案?,java,android,sqlite,greendao,Java,Android,Sqlite,Greendao,我有一个主键列表,需要从greendao数据库中获取这些元素 最简单的方法是单独查询每个对象并将其插入列表: public List<MyObject> getMyObjectByIds(List<String> ids) { List<MyObject> result = new ArrayList<MyObject>(); for (String id : ids) { QueryBuilder<MyOb

我有一个主键列表,需要从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;
}
公共列表GetMyObjectById(列表ID){
列表结果=新建ArrayList();
用于(字符串id:ids){
QueryBuilder QueryBuilder=myObjectDao.QueryBuilder();
MyObject MyObject=queryBuilder.where(MyObjectDao.Properties.Id.eq(Id)).unique();
结果:添加(myObject);
}
返回结果;
}
但是,这似乎非常无效,因为它必须执行ids.size()查询。使用多个OR语句的单个查询会更好。但是,由于and方法只包含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;
}
公共列表GetMyObjectById(列表ID){
QueryBuilder QueryBuilder=myObjectDao.QueryBuilder();
如果(ids.size()==0){
列表结果=新建ArrayList();
返回结果;
}else if(id.size()==1){
返回queryBuilder.where(MyObjectDao.Properties.Id.eq(ids.get(0))).list();
}else if(id.size()==2){
queryBuilder.whereOr(MyObjectDao.Properties.Id.eq(ids.get(0)),MyObjectDao.Properties.Id.eq(ids.get(1));
返回queryBuilder.list();
}else if(id.size()>=3){
queryBuilder.where(MyObjectDao.Properties.Id.eq(ids.get(0)),MyObjectDao.Properties.Id.eq(ids.get(1)),getwhere条件seqidrefromthirdelementon(ids));
返回queryBuilder.list();
}
}
私有WhereCondition[]getWhereConditionsEqIdFromThirdElementOn(列表ID){
WhereCondition[]whereConditions=新WhereCondition[id.size()-1];
对于(int i=2;i

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

我可能遗漏了一些内容,但这看起来像是一个按书使用的示例。

您可以尝试这样做:

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();
}
公共列表GetMyObjectById(列表ID){
列表结果=新建ArrayList();
QueryBuilder QueryBuilder=myObjectDao.QueryBuilder();
用于(字符串id:ids){
queryBuilder.whereOr(MyObjectDao.Properties.Id.eq(Id));
}
返回queryBuilder.list();
}

根据文档,似乎每个where或函数都使用逻辑OR将给定条件添加到前面的where子句中。正如Dragon Bozanovic所指出的,可能需要在for.

之前添加一个初始where子句
GreenDAO
中确实有用于此目的的
运算符

public List<MyObject> getMyObjectByIds(List<String> ids) {
    return myObjectDao.queryBuilder()
             .where(MyObjectDao.Properties.Id.in(ids)).list();
}
公共列表GetMyObjectById(列表ID){
返回myObjectDao.queryBuilder()
.where(MyObjectDao.Properties.Id.in(ids)).list();
}

是的,GreenDAO确实有IN运算符,我添加了代码作为答案。这不会起作用,因为
whereOr
函数至少需要两个参数。这正是我需要解决的问题……这正是我想要的。出于某种原因,我只是在查看
QueryBuilder
的函数,而
属性本身就有了解决方案。[链接]()