greenDAO 基本使用

greenDAO是一个可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案。 greenDAO主要特点:

  • 最大性能(最快的Android ORM)
  • 易于使用
  • 高度优化
  • 最小内存优化

greenDAO的使用需先让java项目生成DAO文件,android使用生成的DAO文件操作数据库。 下面是greenDAO具体在Android stdio中的使用步骤

  • 系统环境:win10
  • 开发软件:Android stdio 2.2 Preview 3

greenDao相关:

  1. 官网:http://greendao-orm.com/
  2. GitHub:https://github.com/greenrobot/greenDAO

  1. 首先创建一个项目: 

  2. 查阅官方问档得知Android中使用需先生成DAO文件。DAO文件的生成需指定目录则先在Android包内创建目录文件。 
    将文件目录在 build.gradle/app中配置

    sourceSets {
        main {
            java.srcDirs = ['src/main/java', 'src/main/java-dao']
        }
    }

并导入:

 compile 'org.greenrobot:greendao:2.2.1'

可以从Github导入最新版本

创建Java Library在build.gradle/greenlib中配置:

compile 'org.greenrobot:greendao-generator:2.2.0'  

编写ExampleDaoGenerator 类

public class ExampleDaoGenerator {  
    public static void main(String[] args) throws Exception {
        // 正如你所见的,你创建了一个用于添加实体(Entity)的模式(Schema)对象。
        // 两个参数分别代表:数据库版本号与自动生成代码的包路径。
        Schema schema = new Schema(1, "com.greenDAOTest.greendao");
//      当然,如果你愿意,你也可以分别指定生成的 Bean 与 DAO 类所在的目录,只要如下所示:
//      Schema schema = new Schema(1, "me.itangqi.bean");
//      schema.setDefaultJavaPackageDao("me.itangqi.dao");

        // 模式(Schema)同时也拥有两个默认的 flags,分别用来标示 entity 是否是 activie 以及是否使用 keep sections。
        // schema2.enableActiveEntitiesByDefault();
        // schema2.enableKeepSectionsByDefault();

        // 一旦你拥有了一个 Schema 对象后,你便可以使用它添加实体(Entities)了。
        addNote(schema);

        // 最后我们将使用 DAOGenerator 类的 generateAll() 方法自动生成代码,此处你需要根据自己的情况更改输出目录(既之前创建的 java-gen)。
        // 其实,输出目录的路径可以在 build.gradle 中设置,有兴趣的朋友可以自行搜索,这里就不再详解。
        new DaoGenerator().generateAll(schema, "../greenDAOTest/app/src/main/java-dao");
    }

    /**
     * @param schema
     */
    private static void addNote(Schema schema) {
        // 一个实体(类)就关联到数据库中的一张表,此处表名为「Note」(既类名)
        Entity note = schema.addEntity("Note");
        // 你也可以重新给表命名
        // note.setTableName("NODE");

        // greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值
        // 接下来你便可以设置表中的字段:
        note.addIdProperty();
        note.addStringProperty("text").notNull();
        // 与在 Java 中使用驼峰命名法不同,默认数据库中的命名是使用大写和下划线来分割单词的。
        // For example, a property called “creationDate” will become a database column “CREATION_DATE”.
        note.addStringProperty("comment");
        note.addDateProperty("date");
    }
}

运行类打印一下信息表示成功同时在java包下出项一下目录结构至此完成所有基本部署。

代码解析。

首先来看ExampleDaoGenerator.java文件。其中有两个方法,一个是main()方法,为程序入口。 在main()首先创建Schema实例,注意为de.greenrobot.daogenerator.Schema。为模式对象:

// 两个参数分别代表:数据库版本号与自动生成代码的包路径。
        Schema schema = new Schema(1, "com.greenDAOTest.greendao");

第二个方法addNote(schema)方法为自写方法,在其中添加表至schema。需要用到de.greenrobot.daogenerator.Entity类。通过此类可以在不使用SQL语句前提下创建表、表约束、键值。带,代码如下:

    private static void addNote(Schema schema) {
        // 一个实体(类)就关联到数据库中的一张表,此处表名为「Note」(既类名)
        Entity note = schema.addEntity("Note");
        // 你也可以重新给表命名
        // note.setTableName("NODE");
        // greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值
        // 接下来你便可以设置表中的字段:
        note.addIdProperty(); //ID字段可以自增长
        //一下为基本类型字段
        note.addBooleanProperty("NoteBoolean");
        note.addStringProperty("text").notNull(); //添加非空约束
        note.addStringProperty("comment");
        note.addDateProperty("date");
    }

最后创建:

// 最后我们将使用 DAOGenerator 类的 generateAll() 方法自动生成代码,此处你需要根据自己的情况更改输出目录(既之前创建的 java-dao)。
        new DaoGenerator().generateAll(schema, "../greenDAOTest/app/src/main/java-dao");

OK 现在我们已经生成了所有操作文件,下面就是在Android项目中的具体应用。 首先我们认识下生成的四个文件,有一张图表示其关系:

  • DaoMaster:它提供操作了DaoSession方法,其内部类OpenHelperDevOpenHelper实现了SQLiteOpenHelper并创建数据库的框架。
  • DaoSession:会话层,操作具体的DAO对象,比如getXXX()方法。
  • xxxDao:实际生成的表对象DAO类,通常对应具体的类,其有更多的权限和方法来操作数据库元素。创建表、添加数据、删除数据、查询等。
  • xxxEntity:持久的实体对象,于表对应的相关类。

代码:

    private void initDataBase() {
        //1.通过 DaoMaster.DevOpenHelper 内部类创建数据库并获取 SQLiteDatabase
        DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
        SQLiteDatabase database = devOpenHelper.getWritableDatabase();
        //2.通过获取到的 SQLiteDatabase 创建 DaoMaster
        DaoMaster daoMaster = new DaoMaster(database);
        //3.通过 DaoMaster 获得 DaoSession
        DaoSession daoSession = daoMaster.newSession();
        //4.通过 daoSession 获得对应表的 NoteDao
        NoteDao noteDao = daoSession.getNoteDao();
    }

这时我们就可以真正对数据进行操作了:

        //查询
        String textColumn = NoteDao.Properties.Text.columnName; //注:内部类Properties为表映射的元数据。
        String orderBy = textColumn + " COLLATE LOCALIZED ASC";
        Cursor cursor = database.query(noteDao.getTablename(), noteDao.getAllColumns(), null, null, null, null, orderBy);
        //添加
        Note note = new Note(1L, "one", null, new Date());
        noteDao.insert(note);
        //删除
        noteDao.deleteByKey(1L);//要删除的行的ID
        //改变
        noteDao.update(new Note(1L,"two",null,new Date()));
posted @ 2017-05-02 11:10  天涯海角路  阅读(221)  评论(0)    收藏  举报