Android GreenDao浅析

GreenDAO简介

GreenDao是一个为了帮助Android开发者操作SqLite数据库的开源项目。SQLite数据库是一个轻量级的关系型数据库。但是,对SQLite数据库操作需要大量的额外工作,例如,写SQL语句和解析查询出来的结果是一个很繁琐的任务。GreenDao将可以为你解决这一切工作:它可以把Java对象转换成数据库表(也就是所谓大家熟悉的ORM,做过Java的同学应该知道Hibernate框架),用GreenDao可以通过java简单对象的API对数据进行更新、删除以及查询获取的java对象。

这里写图片描述

GREENDAO 设计的主要目标
一个精简的库
1. 性能最大化
2. 内存开销最小化
3. 易于使用的 APIs
4. 对 Android 进行高度优化

GREENDAO 设计的主要特点
1. greenDAO 性能远远高于同类的 ORMLite
2. greenDAO 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf 协议与服务器交互,将不需要任何的映射。
3. 与 ORMLite 等使用注解方式的 ORM 框架不同,greenDAO 使用「Code generation」的方式,这也是其性能能大幅提升的原因。

GreenDao使用步骤

为了在我们的 Android 工程中使用 greenDAO ,我们需要另建一个纯 Java Project,用于自动生成后继 Android 工程中需要使用到的 Bean、DAO、DaoMaster、DaoSession 等类。

1、在该项目新建一个与java文件夹平级的java-gen文件夹

(名字无所谓,这个文件夹待会会在代码里面配置),这个文件夹主要是为了存放生成的文件Bean、DAO、DaoMaster、DaoSession等
这里写图片描述

2、在该Android项目的build.gradle文件添加以下语句

添加java.srcDirs主要是为了java-gen下的文件能编译进项目,下面2个库分别是GreenDao的库和对应的纯java代码对应的库。

sourceSets {
        main {
            java.srcDirs = ['src/main/java', 'src/main/java-gen']
        }
    }
    dependencies {
        compile 'org.greenrobot:greendao:2.2.0'
        compile 'org.greenrobot:greendao-generator:2.2.0'
    }

3、再新建一个生成器java项目

(路径个人觉得无所谓)

public class ExampleDaoGenerator {

    public static void main(String[] args) throws Exception {
        // 正如你所见的,你创建了一个用于添加实体(Entity)的模式(Schema)对象。
        // 两个参数分别代表:数据库版本号与自动生成代码的包路径。
        Schema schema = new Schema(1, "com.aaa.bbb");
//      当然,如果你愿意,你也可以分别指定生成的 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, "/Users/shenlong/develop/StudioProjects/Test/app/src/main/java-gen");
    }

    /**
     * @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");
    }
}

大家注意,这里我把自动生成的代码包路径设置为com.aaa.bbb,而把输出的目录设置为刚刚新建的java-gen。

4、生成 DAO 文件(数据库)

执行刚刚的ExampleDaoGenerator.java,如下图
这里写图片描述

如果运行正确,将会出现如下日志,并且在主工程「java-gen」下会发现生成了DaoMaster、DaoSession、NoteDao、Note共4个类文件

输出log

生成的文件

介绍一下这4个类:
1. DaoMaster:一看名字就知道它是Dao中的最大的官了。它保存了sqlitedatebase对象以及操作DAO classes(注意:不是对象)。其提供了一些创建和删除table的静态方法,其内部类OpenHelper和DevOpenHelper实现了SQLiteOpenHelper并创建数据库的框架。
2. DaoSession:会话层。操作具体的DAO对象(注意:是对象),比如各种getter方法。
3. XXXDao:实际生成的某某DAO类,通常对应具体的java类,比如NoteDao等。其有更多的权限和方法来操作数据库元素。
4. XXX:持久的实体对象。通常代表了一个数据库row的标准java properties。

Android中对数据库操作

在android代码中:
1、创建数据库

private void setupDatabase() {
    // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
    // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
    // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
    // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
    DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "nDateBase", null);
    db = helper.getWritableDatabase();
    // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
    daoMaster = new DaoMaster(db);
    daoSession = daoMaster.newSession();
}

到这里,其实数据库已经建立好了,数据库名为nDateBase,表名为Note(这些在上面的代码中都有设置的)
看下效果:
这里写图片描述

2、插入一条数据测试

private void addNote() {

    final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
    String comment = "Added on " + df.format(new Date());

    // 插入操作,简单到只要你创建一个 Java 对象
    Note note = new Note(null, "test", comment, new Date());
    getNoteDao().insert(note);
    Log.d("Picasso", "Inserted new note, ID: " + note.getId());
}

这里写图片描述

数据已经成功添加了。

end
=============================
参考博客
ORM 框架之 greenDAO 使用心得
GreenDao官网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值