一.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();