Java 使用WHERE或in-greenDAO选择多个元素的简单解决方案?
我有一个主键列表,需要从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
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
的函数,而属性本身就有了解决方案。[链接]()