您的位置:首页 > 数据库

greenDao学习

2016-03-16 16:02 357 查看
项目地址为: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<Person> 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<Person> list = query.list();


只要按照上面给StringCondition 传入sql 中 where 子句即可

或者用queryRaw方法,写如where子句,这个where 子句就添加到SELET * FROM PERSON后面

List<Person> 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方法:

list() 返回ArrayList对象,所有的实体加载进内存

lsitLazy() 返回LazyList对象,当使用list中的一个元素时,该元素才加载进内存并且缓存。必须关闭。

lazyList.close();


listLazyUncached() 无论什么时候使用list中的元素时候都要从数据库中加载。必须关闭。

listIterator() 返回迭代器,然后可以遍历所有记录,使用到记录时加载。。不缓存。必须关闭。

必须被关闭的原因是为了能够在用到时候加载数据,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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  greenDao orm 数据库