项目地址为:https://github.com/greenrobot/greenDAO
greenDao是一个对象关系映射(ORM)工具,给关系型数据库SQLite提供面向对象接口。如下图所示:
greenDao是怎么产生数据库对象代码的呢?
需要建一个Java工程来产生代码,然后把产生的代码给我们的Android工程使用。当然这两个工程都需要相应的依赖。在github的greenDao项目说明中有提供如下:
这个是Android工程的依赖:
compile 'de.greenrobot:greendao:2.1.0'
这个是Java 工程,也就是代码产生工程的依赖:
compile 'de.greenrobot:greendao-generator:2.1.0'
创建产生代码的工程
在Android Studio 中 New Module,选择Java Library 并添加依赖。
只需要一个类,代码如下:
public static void main(String[] args) throws Exception {
//"com.pngfi.gen"是生成代码所在的包结构
Schema schema = new Schema(1, "com.pngfi.gen");
addPerson(schema);
//第二个参数是生成代码所放的路径
new DaoGenerator().generateAll(schema, "D:/src-gen");
}
private static void addPerson(Schema schema) {
Entity person = schema.addEntity("Person");
person.addIdProperty();
person.addStringProperty("name").notNull();
person.addIntProperty("age");
person.addDateProperty("birth");
person.addStringProperty("sex");
}
其中主要的代码就是Entity的定义,Entity就对应数据库中的表,每个Property对应表中的列。
运行代码,就会在 D:/src-gen 目录下产生代代码,并且有其包结构。
创建Android工程
暂且先不管这些类的作用,先看一下怎么在Android工程中配合使用。
新建一个Android Module ,然后将这拷贝这四个类,并且添加相应的依赖。
在Activity的OnCreate方法中加入以下代码
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "persons.db", null);
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();
PersonDao personDao = daoSession.getPersonDao();
构造DaoMaster.DevOpenHelper 能帮助我们创建数据库,并且得到可写或者可读的数据库对象。把该数据库对象通过DaoMaser的包装,我们可以得到DaoSession 对象,进而得到我们想要操作的任何一个Dao。其中DaoMaster对象对应着一次数据库的连接,一次连接可以有多个Session,每个Session都会分配内存。
插入
personDao.insert(new Person(1l,"qiuri",28,new Date(),"男"));
在Genymotion模拟器中执行代码,并在Android Device Monitor中的\data\data目录下找到我们运行程序的包,如下图所示
然后点击右上交左边第一个按钮,把数据库文件导出到桌面,打开后可以看到数据已经插入成功。
查找
1、 简单查询
//查询所有
List list = personDao.queryBuilder().list();
//复杂查询和排序
personDao.queryBuilder().where(PersonDao.Properties.Name.eq("qiuri")).orderAsc(PersonDao.Properties.Age).list();
where 函数可以添加多个条件,这些条件之间是与的关系。
2、 or 和and
qb.or() 和qb.and()这两个函数都用来产生条件,很明显or()是返回所有条件的逻辑或的条件,and()返回所有条件逻辑与的结果。
就像下面的两种写法,效果是一样的
qb.where(qb.and(PersonDao.Properties.Sex.eq("男"), PersonDao.Properties.Age.gt(28))).list();
qb.where(PersonDao.Properties.Sex.eq("男"),PersonDao.Properties.Age.gt(28));
3、 Limit, Offset,和Pagination
qb.limit(2); //限制返回的结果集数量
offset(int n) 设置偏移量,即偏移 n个开始查询;必须和limit()配合使用,不能单独使用
qb.limit(2);
qb.offset(1);
在做ListView的滚动加载更多的时候,这两个就可以配合起来使用。
4、使用SQL 语句查询
如果QueryBuilder 相应的一些方法不能满足你的需求,也可以使用sql语句查询:
Query query = personDao.queryBuilder().where(
new WhereCondition.StringCondition("SEX='男'")).build();
List list = query.list();
只要按照上面给StringCondition 传入sql 中 where 子句即可
或者用queryRaw方法,写如where子句,这个where 子句就添加到SELET * FROM PERSON后面
List list = personDao.queryRaw("WHERE SEX = ? AND AGE > ?", "男","27");
5、Query 和LazyList
类Query 代表一个查询,这个查询可以被执行多次。上面我们用QueryBuilder的list()方法去获得查询结果时候,实际上在QueryBuilder类内部使用了Query类。如果想要多次执行一个查询,我们可以调用build()方法来产生Query对象,以后再多次调用list()即可。
greenDao也可以返回一条记录或者不满足条件的话返回null,调用Query或者QueryBuilder的unique()方法。
如果你想查询多条记录的话,可以用lsit方法:
lazyList.close();
必须被关闭的原因是为了能够在用到时候加载数据,LazyList类中维护了一个数据库的Cursor对象。
lsitLazy()和listIterator()在获取或者遍历所有的元素后会自动关闭cursor,但是如果没有遍历完,必须自己手动关闭。
修改
Person p = personDao.queryBuilder().where(PersonDao.Properties.Name.eq("qiuri")).unique();
p.setAge(100);
personDao.update(p);
很简单不多说,unique()只返回一个记录
删除
personDao.delete();
personDao.deleteByKey(int key);