1. 概述
1.1. 什么是greenDAO?
用greenDAO官方的话说,greenDAO 是一个轻量、快速的 Android SQLite 对象映射数据库解决方案, (ORM对象关系映射英语:Object Relational Mapping) greenDAO在最小内存下实现强大性能。 什么是ORM?对于很多人来讲并不很好理解,尤其是新手完全不知道这个东西是做什么的。 其实,说的简单一点,greenDAO 就是一个Android 数据库操作框架,通过这个框架,能通过代码自动生成 实体类(Bean ) 和 DAO层。也就是说,使用这个框架,操作数据库的时侯就不需要再写自已再写DbHelper、DAO层的一大堆代码,对Cursor进行操作。 相对于编写繁杂的DAO层增删改查代码,greenDao已经简化了大量的工作。但是,greenDao对于OrmLite等框架而言还是抽象、复杂了不少。 从性能上讲,greenDao的确是比OrmLite 更高效,但对一般应用来讲,简单的数据操作,毫秒级的速度差异是很难让人察觉到的。因此,如果对性能要求不是特别要求,我还是推荐操作更加简单方便的OrmLite。 本文档基于greenDAO 的源码对greenDAO的使用清晰简单的介绍。 |
2. 源码下载及使用分析
2.1. 源码下载
2.1.1. 1 打开 https://github.com/greenrobot/greenDAO
复制 HTTPS 后面的地址 https://github.com/greenrobot/greenDAO.git |
2.1.2. 2用Android Studio 或其它工具克隆到本地
|
|
|
2.2. 用Android Studio 导入项目
GreenDAO可以直接通过Gbuild.gradle 脚本导入进AndroidStudio |
|
在Android Studio 中我们将项目以 Project 的展示方式将项目展开,会发现这个项目包含了子项目 分别是:
有很多新朋友,一看到这么多类库的时侯基本就放弃了,包括我也是一样,最开始看到这个项目的时侯觉得这个项目把一个数据库操作搞的这么复杂,反而是增加了烦恼。 事实上,假如我们仔细的对这个些项目进行条理性的分析后会发现,我们真正要用到的并不多。通过名字分析,我们可以发现,这六个项目实际上是三组:分别是 DaoCore和DaoGenerator的源码、示例,和测试。 1{ DaoCore,DaoGenerator} 2{ DaoExample , DaoExampleGenerator} 3{ DaoTest,DaoTestGenerator}
首先,一开始的时侯,我们并不需要测试工程,因此我们可以直接忽略DaoTest 和DaoTestGenerator,假如你看这心烦,可以先直接将这两个项目删掉,
剩下的四个项目也可以从名字上推断出来,带Example 的就是示例了,接下来,我们的重点是第二组 { DaoExample , DaoExampleGenerator}项目
|
2.3. 示例程序DaoExample
从build.gradle 可以看成到,这个程序依赖于DaoCore ,我们前面已经说过,DaoCore这个库是我们要在项目中用到的GreenDAO的核心库。或者可通过添加maven依赖编译
dependencies {
展开 DaoExample 我们会发现 这个项目只有一个Activity, 剩下的就是一推乱糟糟的类,通过分析,我们隐约感到其中的某些类有些关系,从名字上可以看出,应该是实体与DAO的关系,事实上也确实如此。
稍后我们使用用DaoExampleGenerator 生成代码时,相信可以让大家更容易理解这些类的关系。
|
2.4. 代码生成器示例DaoExampleGenerator 分析
GreenDao 过个项目中,最令新手摸不着头脑的就是 DaoGenerator 和他的示例 DaoExampleGenerator 从图中,我们可以看到,这是一个纯JAVA项目,而不是Android 项目,并且依赖了DaoGenerator 这个工程,没错,因为是他的示例,所以一定会依赖这个项目的。 DaoGenerator 究竟是什么呢? 这个单从阅读代码来理解还是需要很深的Java 基础的,很多新手基本看到这里就放弃了。 如果仅仅是使用这个框架,完全没有必要去看这个具体实现,就像我们很多人不会编Android程序仍然可以使用Android手机一样,大家只需要了解一点:这是一个代码生成器,通过这个类库可以生成GreenDAO所需要的 实体类和DAO层代码,这就是关键所在了,换句话说,就是以后我们项目中例用GreenDAO的话,就不用单独建实体类(Bean)了,而是可以通过DaoGenerator 同时生成实体类和对应用的DAO层代码。 |
2.4.1. DaoExampleGenerator代码分析
public class ExampleDaoGenerator { "../DaoExample/src/main/java"); // 生成的代码存放的根目录
从代码中我们可以看到,在main 方法中调用了两个方法,我们只分析其中一个就好了,从addNote(schema) 这个方法中我们可以看到,在这个方法中,向 schema 这个域名空间中添加了一个名为 “Note”的实体类,这个类中有四个属性,id、text、comment 、data 。 new DaoGenerator().generateAll(schema, "../DaoExample/src/main/java"); 这句代码的意思是,生成的代码放到 "../DaoExample/src/main/java",这个目录下。 需要注意的是: 在windows7 环境下,需要把 "../DaoExample/src/main/java",改成 "././DaoExample/src/main/java" 否则会报出如下找不到目录的异常: |
greenDAO Generator Copyright 2011-2015 Markus Junginger, greenrobot.de. Licensed under GPL V3. This program comes with ABSOLUTELY NO WARRANTY Exception in thread "main" java.io.IOException: ../DaoExample/src/main/java does not exist. This check is to prevent accidental file generation into a wrong path. at de.greenrobot.daogenerator.DaoGenerator.toFileForceExists(DaoGenerator.java:128) at de.greenrobot.daogenerator.DaoGenerator.generateAll(DaoGenerator.java:86) at de.greenrobot.daogenerator.DaoGenerator.generateAll(DaoGenerator.java:79) at de.greenrobot.daogenerator.gentest.ExampleDaoGenerator.main(ExampleDaoGenerator.java:39) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Process finished with exit code 1 |
2.4.2. 删除DaoExample Activity 之外的代码
就像这样, 删除DaoExample 中除了 NoteActivity 之外的所有代码,为什么要删除其它代码呢?刚才,我们已经看到了,在DaoExampleGenerator 的代码中 new DaoGenerator().generateAll(schema, "../DaoExample/src/main/java"); 把生成的代码放到了这个项目中,因此,我们暂且将其它代码删除掉,来验证 DaoExampleGenerator |
2.4.3. 使用DaoExampleGenerator生成代码
右键运行 DaoExampleGenerator
控制台输出以下内容,说明已经生成了我们所要的代码。
greenDAO Generator Copyright 2011-2015 Markus Junginger, greenrobot.de. Licensed under GPL V3. This program comes with ABSOLUTELY NO WARRANTY Processing schema version 1000... Written J:\domes\greenDAO\DaoExample\src\main\java\de\greenrobot\daoexample\NoteDao.java Written J:\domes\greenDAO\DaoExample\src\main\java\de\greenrobot\daoexample\Note.java Written J:\domes\greenDAO\DaoExample\src\main\java\de\greenrobot\daoexample\CustomerDao.java Written J:\domes\greenDAO\DaoExample\src\main\java\de\greenrobot\daoexample\Customer.java Written J:\domes\greenDAO\DaoExample\src\main\java\de\greenrobot\daoexample\OrderDao.java Written J:\domes\greenDAO\DaoExample\src\main\java\de\greenrobot\daoexample\Order.java Written J:\domes\greenDAO\DaoExample\src\main\java\de\greenrobot\daoexample\DaoMaster.java Written J:\domes\greenDAO\DaoExample\src\main\java\de\greenrobot\daoexample\DaoSession.java Processed 3 entities in 1041ms Process finished with exit code 0
|
再次展开 DaoExample 示例程序,发现已经为我们重新生成了相关的类。
运行 DaoExample
|
2.4.4. 定制调整实体类与DAO层代码包结构
修改 代码生成器 ExampleDaoGenerator 的代码 public class ExampleDaoGenerator { // 域名空间 就是包名,生成代码的 包名,实体类所在包 // 设置DAO层代码的 包名
addNote(schema); // 生成的代码存放的根目录 这里存放到了 本项目下的src 目录下
|
右键运行 DaoExampleGenerator 我们发现 已经在当前目录已完全美实现了实体类与DAO层代码的分离 ,使代码的可读性立刻提升了一个量级。
至此,我们已经掌握了greenDao 源示例代码的使用与编译。 |
2.5. greenDAO使用小结
greenDao 的使用可以总结为以下几个步骤 1 新建Android 项目 添加 DaoCore 项目依赖或者 jar 包 2 新建 JAVA 代码生成器项目 添加 DaoGenerator 项目依赖,并生成 实体类和 DAO层代码。 3 在Android 项目中使用代码生成器生成的 实体类和DAO层代码。 |