GreenDAO使用

一、greenDao简介

简单地讲,greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。

 

二、GreenDao设计的主要目标:

1.  一个精简的库

2.  性能最大化

3.  内存开销最小化

4.  易于使用的APIs

5.  对Android进行高度优化

 

三、greenDao的使用

1.需要的jar包:greendao-generator.jar和greendao.jar

Gradle配置:compile 'org.greenrobot:greendao-generator:3.2.0'

            compile'org.greenrobot:greendao:3.2.0'

 

2.生成工具类

2.1一个普通的java工程,添加greendao-generator.jar包。

2.2 添加一个类,在主函数中创建自己所需要的表结构:

  

packagecom.example;
 
importorg.greenrobot.greendao.generator.DaoGenerator;
importorg.greenrobot.greendao.generator.Entity;
importorg.greenrobot.greendao.generator.Property;
importorg.greenrobot.greendao.generator.Schema;
 
public class MyClass{
    public static void main(String[] args) {
        // Schema构造函数中第一个参数为数据库版本,第二个参数为生成类的包名
        Schema schema = new Schema(1,"com.example.hps.greendaodemo1");
        
        // 新建一个实体,对应一张表
        Entity son =schema.addEntity("Son");
        
        // 添加主键
        son.addIdProperty();
        
        // 其他字段
       son.addStringProperty("name");
        son.addIntProperty("age");
 
        Entity father =schema.addEntity("Father");
        father.addIdProperty();
       father.addStringProperty("name");
        father.addIntProperty("age");
        
        // 添加外键
        Property sonId =father.addLongProperty("sonId").getProperty();
 
        // 一对一关系
        father.addToOne(son, sonId);
        
        // 一对多的关系
        son.addToMany(father,sonId).setName("Fathers");
 
        try {
            newDaoGenerator().generateAll(schema, "app/src/main/java");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
 
上述主函数中定义了两张表结构,Son和Father(注意Entity的首字母必须大写), Father表有一个外键sonId, son和father是一对多关系。执行上述主函数后,会生成如下几个类:
将这些类拷贝到自己的android工程,即可对进行数据库相关操作。
 
2.3 在android工程中使用greenDao操作数据库。
(1)打开数据库:
private voidopenDb() {
        // DevOpenHelper的3个参数分别为上下文,数据库名,游标工厂
        db = newDaoMaster.DevOpenHelper(MainActivity.this, "person.db",null).getWritableDatabase();
        master = new DaoMaster(db);
        session = master.newSession();
        sonDao = session.getSonDao();
        fatherDao = session.getFatherDao();
 
        Toast.makeText(MainActivity.this,"db is opened", Toast.LENGTH_SHORT).show();
}
打开数据库后,可以通过sonDao和fatherDao对两个表进行增删改查
(2)插入:
    Son son = new Son();
       son.setName("nate");
       son.setAge(23);
       sonDao.insert(son);
新建一个实体son,赋值后通过sonDao.insert()方法即可插入到数据库中
(2)更新:
   sonDao.insertOrReplace(item);
   其中item为Son对象,调用sonDao的insertOrReplace()方法,如果数据库中存在,则更新该条记录,如果不存在,则执行插入操作。
(3)删除:
sonDao.deleteByKey(id);
sonDao.deleteAll();
sonDao.deleteInTx(sons);
删除的3种方式,其中deleteByKey(id)是根据主键进行删除,deleteAll()将删除表中的所有数据,deleteInTx(sons)是根据集合进行批量删除,该集合须实现Iterator接口。
(4)查询:
查询所有:
sonDao.queryBuilder().list();
sonDao.queryBuilder().listLay();
sonDao.queryBuilder().listLazyUncached()
sonDao.queryBuilder().listIterator()
上面四种方法都可以查询所有记录,后面三种可以延迟加载,只是在自己需要取数据的时候进行查询,后面两种必须关闭游标。
 
等于查询:
sonDao.queryBuilder().where(SonDao.Properties.Name.eq("John")).unique();
上面是从son表中查询name=”John”的记录,后面的unique()表示查询记录只有一条,如果有多条则会抛异常,这时可换成list();
 
Like模糊查询:
sonDao.queryBuilder().where(SonDao.Properties.Name.like("%Tom%")).list();
查询name中包含“Tom”的记录。
 
Between查询:
sonDao.queryBuilder().where(SonDao.Properties.Age.between(20,30)).list();
查询年龄在20到30岁的记录。
 
大于查询:
sonDao.queryBuilder().where(SonDao.Properties.Age.gt(20)).list();
查询年龄大于20的记录,同理小于为lt, 不等于为notEq.
 
排序查询:
sonDao.queryBuilder().where(SonDao.Properties.Age.notEq(20)).orderAsc(SonDao.Properties.Age).list()
上述语句查询年龄不等于20的记录并根据年龄进行升序排序,降序为orderDesc()
 
自定义sql查询:
sonDao.queryBuilder().where(newWhereCondition.StringCondition("FATHER_ID IN "
              +"(SELECT _ID FROM FATHER WHERE AGE < 60)")).list()
如果查询条件比较复杂,则自己可以自定义查询条件,但前面Select * from son Where是固定的,不能修改。
 
一对一查询:
由于father表与son表是一对一关系,则可以
List<Father> fatherList =fatherDao.queryBuilder().list()
For(Father father:fatherList) {
   Son son =father.getSon();
}
通过上述语句可以进行一对一查询
 
 
一对多查询:
List<Son> sonList = sonDao.queryBuilder().list();
        for (Sonson: sonList) {
           List<Father> fatherList = son.getFathers();
 
            for(Father father: fatherList) {
               Log.i("nate", "query called with son: " +son.getName() + ", father:" + father.getName());
            }
        }
son表与father表是一对多关系,可以通过Son的getFathers方法进行一对多查询。
 
多线程查询
final Query query = sonDao.queryBuilder().build();
 
        newThread() {
           @Override
            publicvoid run() {
               List data = query.forCurrentThread().list();
               Log.i("nate" , "queryAll() called with " +data.toString());
            }
        }.start();

GreenDao在执行多线程查询时,必须先调用forCurrentThread方法。