greenDao学习

项目地址为: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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值