在 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();
}
我有一个主键列表,我需要从我的 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();
}