一.GreenDao增删改查:
接着上一篇的文章继续学习:
插入数据:
<span style="font-size:18px;"> Note note = new Note(1L, "1", "1", new Date());
noteDao.insert(note);</span>
插入批量数据:
<span style="font-size:18px;"> Note note = new Note(1L, "1", "1", new Date());
Note note1 = new Note(2L, "1", "1", new Date());
Note note2 = new Note(3L, "1", "1", new Date());
Note note3 = new Note(4L, "1", "1", new Date());
final List<Note> list = new ArrayList<Note>();
list.add(note);
list.add(note1);
list.add(note2);
list.add(note3);
noteDao.insertInTx(new Iterable<Note>(){
@Override
public Iterator<Note> iterator() {
// TODO Auto-generated method stub
return list.iterator();
}
});</span>
删除数据:
<span style="font-size:18px;"> Note note = new Note(1L, "1", "1", new Date());
noteDao.delete(note);//传入Note来删除数据
noteDao.deleteByKey(1L);//传入删除数据的id值</span>
删除所有数据:
<span style="font-size:18px;">noteDao.deleteAll();</span>
修改数据:
<span style="font-size:18px;"> Note note = new Note(1L, "123", "1", new Date());
noteDao.update(note1);</span>
查询数据:
<span style="font-size:18px;">List<Note> list = noteDao.loadAll();
Iterator<Note> it = list.iterator();
while(it.hasNext()){
Note note = it.next();
System.out.println(note.getId());
}</span>
二.自定义查询:
自定义查询就要用到QueryBuilder类,这个类大量节省了你写sql的时间,但是发现语句中的bug还是不容易的,因为要在编译时才执行,所以不容发现错误。
根据条件查询:
<span style="font-size:18px;">QueryBuilder<Note> bi = noteDao.queryBuilder();
//查询id为1的数据
List<Note> list = bi.where(Properties.Id.eq("1")).list();
</span>
where中可以传入多个条件。
查询排序:
<span style="font-size:18px;">QueryBuilder<Note> bi = noteDao.queryBuilder();
//查询id为1的数据,以Id排序返回
List<Note> list = bi.where(Properties.Id.eq("1")).orderAsc(Properties.Id).list();</span>
嵌套查询:
QueryBuilder<Note> bi = noteDao.queryBuilder();
// eq相等 notEq 不相等, gt大于 lt小于 ge大于等于 le 小于等于
//这条sql语句就是Text为1,且id大于1,且Comment为1的数据
List<Note> list = bi.where(bi.and(Properties.Text.eq("1"),bi.and(Properties.Id.gt(1),Properties.Comment.eq("1")))).list();
而且QueryBuilder是支持唯一结果和列表结果的。如果想得到一个唯一结果调用QueryBuilder的unique()方法,这样在有匹配条件的时候会返回一个唯一结果,而不是返回null,否则怎会返回null,如果你不想返回null,就用uniqueOrThrow()方法如果没有匹配条件的时候会抛出一个
DaoException异常。
想返回多个实体就用:
list():所有的实体被加载到内存中。该结果通常是一个没有magic involved的ArrayList。使用起来最简单。
listLazy():实体按照需求加载进入内存。一旦列表中的一个元素被第一次访问,它将被加载同时缓存以便以后使用。必须close。
LazyList<Note> list = bi.where(Properties.Text.eq("1")).listLazy();
System.out.println(list.size());
list.close();
ListLasyUncached(): 一个“虚拟”的实体列表:任何对列表元素的访问都会导致从数据库中加载,必须close。listIterator(): 遍历通过需要的时候加载(lazily)获得的结果,数据没有缓存,必须close。
如果你使用QueryBuilder构建了一个Query对象,设置好参数,如果以后不变更参数内容,则这个query可以多次重复使用,比重新构建提高了效率。如果要重新设置参数内容则需要使用setParameter()。
Query<Note> bi = noteDao.queryBuilder().where(Properties.Id.gt("1")).build();
bi.setParameter(0,"2");
LazyList<Note> list = bi.listLazy();
System.out.println(list.size());
list.close();
如果使用上边的sql查询不爽的话可以使用原始的sql语句查询。
Query<Note> bi = noteDao.queryBuilder().where(new StringCondition("_id in (select _id from NOTE where text=1)")).build();
LazyList<Note> list = bi.listLazy();
System.out.println(list.size());
list.close();