Oli*_*etz 0 java sqlite android 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;
}
Run Code Online (Sandbox Code Playgroud)
但是,这似乎非常无效,因为它必须执行ids.size()查询。具有多个OR语句的单个查询会更好。但是,由于whereOr()和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;
}
Run Code Online (Sandbox Code Playgroud)
老实说,这可能会更快,但对我来说仍然很难看。还有另一种方法吗?还是我必须进行原始查询?
正如Dragon Bozanovic所指出的。GreenDAO确实IN有用于此目的的运算符。
public List<MyObject> getMyObjectByIds(List<String> ids) {
return myObjectDao.queryBuilder()
.where(MyObjectDao.Properties.Id.in(ids)).list();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
861 次 |
| 最近记录: |