前言
在平时的开发过程中,大家一定会或多或少地接触到 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、配置依赖
配置greendaogenerator
的build.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/