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」的方式,这也是其性能能大幅提升的原因。
为了在我们的 Android 工程中使用 greenDAO ,我们需要另建一个纯 Java Project,用于自动生成后继 Android 工程中需要使用到的 Bean、DAO、DaoMaster、DaoSession 等类。
(名字无所谓,这个文件夹待会会在代码里面配置),这个文件夹主要是为了存放生成的文件Bean、DAO、DaoMaster、DaoSession等
添加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'
}
(路径个人觉得无所谓)
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。
执行刚刚的ExampleDaoGenerator.java,如下图
如果运行正确,将会出现如下日志,并且在主工程「java-gen」下会发现生成了DaoMaster、DaoSession、NoteDao、Note共4个类文件
介绍一下这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代码中:
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官网