greendao使用教程

来源:互联网 发布:java web开发实战1200 编辑:程序博客网 时间:2024/04/29 18:24

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方法。