Android ORM 框架之 greenDAO

前言

在平时的开发过程中,大家一定会或多或少地接触到 SQLite。然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等。所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite、SugarORM、Active Android、Realm 与 GreenDAO。那就来说说greenDAO吧,下面,我将详解地介绍如何在 Android Studio 上使用 greenDAO,并结在这里记录下使用上的一些心得。

关于greenDAO

这里写图片描述
简单的讲,greenDAO是一个将对象映射到SQLite数据库中的轻量级、快速的ORM解决方案。

greenDAO is a light & fast ORM solution that maps objects to SQLite databases.

greenDAO的设计目标

  • 一个精简的库
  • 性能最大化
  • 内存开销最小化
  • 易于使用的APIs
  • 对Android进行高度的优化

greenDAO设计主要特点

  • greenDAO性能远远高于ORMLite和ActiveAndroid,官方有测试结果
  • greenDAO支持 protocol buffer(protobuf)协议数据的直接存储,如果你通过protobuf协议与服务器交互,将不需要任何映射。
  • 与ORMLite等使用的注解方式的ORM框架不同,greenDAO使用的是Code generation的方式,这也是其性能大幅度提升的原因

生成项目代码

这里写图片描述
要生成项目代码需要在我们的项目里面新建一个纯Java Project用于生成Android工程中需要使用到的Bean、DAO、DAOMaster、DaoSession等类。
具体的详见官方文档说明

使用过程

一、在Android工程中配置greenDao Generator模块

1、建立目录

.src/main目录下新建一个与java同层级的目录名字叫做 java-gen,用于存放由greenDAO生成的文件。
这里写图片描述

新建后目录如下

这里写图片描述

2、配置工程

配置Android工程app的build.gradle添加依赖和源代码目录设置

在android节点下面加入

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

把原来的java目录和刚才新建的java-gen目录都设置为源码目录
设置之后你编译一下你会发现原来的java-gen显示的颜色已经变成了蓝色和原来的java目录是一样的如下图。

这里写图片描述

这样说明目录已经配置好了

下面接着添加依赖,在dependencies节点下面添加依赖
截至发表前最新的稳定版本为2.2.1

compile 'org.greenrobot:greendao:2.2.1'

二、搭建greenDAO Generator纯java工程模块

1、新建模块

通过 File -> New -> New Module -> Java Libary 新建
这里写图片描述

这里写图片描述

这里写图片描述

2、配置依赖

配置greendaogeneratorbuild.gradle添加依赖
在dependencies节点中添加

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

3、编写greenDAOGen类

编写greenDAOGen类用以输出greenDAO Generator,你可以在这个类中通过对象,关系等创建数据库结构。
具体请看代码。

package com.greendao.gen;

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Property;
import de.greenrobot.daogenerator.Schema;

public class greenDAOGen {
    /**
     * 生成代码包名
     */
    public static final String PACKAGE_NAME = "com.xxxx.xxx";
    /**
     * 版本号
     */
    public static final int SCHEMA_VERSION = 1;
    /**
     * <p> /表示根目录</p>
     * <p> ./表示当前路径</p>
     * <p> ../表示上一级父目录<p>
     */
    public static final String OUT_DIR = "./app/src/main/java-gen";
    /**
     * 实体表名
     */
    public static final String TB_SUBJECT = "TBSubject";
    /**
     * 实体表名
     */
    public static final String TB_COURSE = "TBCourse";
    /**
     * 实体表名
     */
    public static final String TB_CLASS = "TBClass";

    public static void main(String[] args) {
        // 正如你所见的,你创建了一个用于添加实体(Entity)的模式(Schema)对象。
        Schema schema = new Schema(SCHEMA_VERSION, PACKAGE_NAME);
        //当然,如果你愿意,你也可以分别指定生成的 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)了。
        addEntities(schema);

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

    /**
     * 创建实体关系
     *
     * @param schema
     */
    private static void addEntities(Schema schema) {

        // 一个实体(类)就关联到数据库中的一张表,此处表名为「TB_SUBJECT」(既类名)
        Entity subject_entity = schema.addEntity(TB_SUBJECT);
        // 你也可以重新给表命名
        // subject_entity.setTableName("TBSUBJECT");

        // greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值
        // 接下来你便可以设置表中的字段:
        subject_entity.addIdProperty().autoincrement().getProperty();
        subject_entity.addStringProperty("name");
        subject_entity.addStringProperty("summary");

        Entity course_entity = schema.addEntity(TB_COURSE);
        course_entity.addIdProperty().autoincrement().getProperty();
        //创建外键关系
        Property subject_fkProperty = course_entity.addLongProperty("sub_id").notNull().getProperty();
        course_entity.addToOne(subject_entity, subject_fkProperty);
        course_entity.addStringProperty("name");
        course_entity.addStringProperty("summary");
        course_entity.addStringProperty("url");

        Entity class_entity = schema.addEntity(TB_CLASS);
        class_entity.addIdProperty().autoincrement().getProperty();
        // 与在 Java 中使用驼峰命名法不同,默认数据库中的命名是使用大写和下划线来分割单词的。
        // For example, a property called “creationDate” will become a database column “CREATION_DATE”.
        Property fkProperty = class_entity.addLongProperty("c_id").notNull().getProperty();
        class_entity.addToOne(course_entity, fkProperty);
        class_entity.addStringProperty("name");
        class_entity.addStringProperty("summary");
        class_entity.addStringProperty("filename");
    }

}

三、运行生成DAO文件

执行generator工程就会在控制台看到日志。如果看到类似如下日志并且在刚才的java-gen文件夹中出现了日志中出现的文件那么说明你成功了。
这里写图片描述

这里写图片描述

附录

http://greenrobot.org/greendao/documentation/introduction/

https://docs.gradle.org/currevnt/dsl/index.html

GreenDAO数据库版本升级

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值