- join(Property sourceProperty, Class destinationEntityClass):多表查询,后面会讲。 输出结果有四种方式,选择其中一种最适合的即可,list()返回值是List,而其他三种返回值均实现Closeable,需要注意的不使用数据时游标的关闭操作:
- list ()所有实体都加载到内存中。结果通常是一个没有魔法的 ArrayList。最容易使用。
- listLazy ()实体按需加载到内存中。首次访问列表中的元素后,将加载并缓存该元素以供将来使用。必须关闭。
- listLazyUncached ()实体的“虚拟”列表:对列表元素的任何访问都会导致从数据库加载其数据。必须关闭。
- listIterator ()让我们通过按需加载数据(懒惰)来迭代结果。数据未缓存。必须关闭。
- orderAsc() 按某个属性升序排;
- orderDesc() 按某个属性降序排;
GreenDao中SQL语句的缩写,我们也了解下,源码在Property中,使用的时候可以自己点进去查询即可:
- eq():“equal (’=?’)” 等于;
- notEq() :“not equal (’<>?’)” 不等于;
- like():" LIKE ?" 值等于;
- between():" BETWEEN ? AND ?" 取中间范围;
- in():" IN (" in命令;
- notIn():" NOT IN (" not in 命令;
- gt():">?" 大于;
- lt():"<? " 小于;
- ge():">=?" 大于等于;
- le():"<=? " 小于等于;
- isNull():" IS NULL" 为空;
- isNotNull():" IS NOT NULL" 不为空;
1. 使用QueryBuilder进行查询操作
1. 简单条件查询
查询当前Student表的所有的数据:
public List queryAllList(){
DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
QueryBuilder qb = daoSession.queryBuilder(Student.class);
List list = qb.list(); // 查出所有的数据
return list;
}
查询Name为“一”的所有Student:
public List queryListByMessage(String name){
DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
QueryBuilder qb = daoSession.queryBuilder(Student.class);
QueryBuilder studentQueryBuilder = qb.where(StudentDao.Properties.Name.eq(“一”)).orderAsc(StudentDao.Properties.Name);
List studentList = studentQueryBuilder.list(); //查出当前对应的数据
return list;
}
2. 原始查询
通过原始的SQL查询语句进行查询!其实上面有提到QueryBuilder的目的就是方便快捷的编写SQL查询语句,避免我们自己在编写过程中出错!简单介绍下通过QueryBuilder编写数据库,方式方法如下 :
public List queryListBySqL(){
// 查询ID大于5的所有学生
DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
Query query = daoSession.queryBuilder(Student.class).where(
new WhereCondition.StringCondition("_ID IN " +
“(SELECT _ID FROM STUDENT WHERE _ID > 5)”)
).build();
List list = query.list();
return list;
}
3. 嵌套条件查询
查询Id大于5小于10,且Name值为"一"的数据:
public List queryList(){
DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
QueryBuilder qb = daoSession.queryBuilder(Student.class);
qb = daoSession.queryBuilder(Student.class);
List list2 = qb.where(StudentDao.Properties.Name.eq(“一”),
qb.and(StudentDao.Properties.Id.gt(5),
StudentDao.Properties.Id.le(50))).list();
return list2;
}
取10条Id大于1的数据,且偏移2条
public List queryListByOther(){
DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
QueryBuilder qb = daoSession.queryBuilder(Student.class);
//搜索条件为Id值大于1,即结果为[2,3,4,5,6,7,8,9,10,11];
// offset(2)表示往后偏移2个,结果为[4,5,6,7,8,9,10,11,12,13];
List list = qb.where(StudentDao.Properties.Id.gt(1)).limit(10).offset(2).list();
return list;
}
4. 多次执行查找
使用QueryBuilder构建查询后,可以重用 Query对象以便稍后执行查询。这比始终创建新的Query对象更有效。如果查询参数没有更改,您可以再次调用list / unique方法。可以通过setParameter方法来修改条件参数值:
public List queryListByMoreTime(){
DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
QueryBuilder qb = daoSession.queryBuilder(Student.class);
//搜索条件为Id值大于1,即结果为[2,3,4,5,6,7,8,9,10,11];
// offset(2)表示往后偏移2个,结果为[4,5,6,7,8,9,10,11,12,13];
Query query = qb.where(StudentDao.Properties.Id.gt(1)).limit(10).offset(2).build();
List list = query.list();
//通过SetParameter来修改上面的查询条件,比如我们将上面条件修改取10条Id值大于5,往后偏移两位的数据,方法如下!
query.setParameter(0,5);
List list1 = query.list();
return list1;
}
5. 在多个线程中使用QueryBuilder
如果在多个线程中使用查询,则必须调用 forCurrentThread ()以获取当前线程的Query实例。Query的对象实例绑定到构建查询的拥有线程。
这使您可以安全地在Query对象上设置参数,而其他线程不会干扰。如果其他线程尝试在查询上设置参数或执行绑定到另一个线程的查询,则会抛出异常。像这样,您不需要同步语句。实际上,您应该避免锁定,因为如果并发事务使用相同的Query对象,这可能会导致死锁。
每次调用forCurrentThread ()时, 参数都会在使用其构建器构建查询时设置为初始参数。
2. 使用QueryBuilder进行批量删除操作
使用QueryBuilder进行批量删除操作,不会删除单个实体,但会删除符合某些条件的所有实体。要执行批量删除,请创建QueryBuilder,调用其 buildDelete ()方法,然后执行返回的 DeleteQuery。
例子:删除数据库中id大于5的所有其他数据
public boolean deleteItem(){
DaoSession daoSession = ((AserbaoApplication