作者: | 蒋东国 |
时间: | 2016年11月9日 星期三 |
应用来源: | hqt APP (测试机型:华为荣耀4X,Samsung Note4) |
博客地址: | http://blog.csdn.net/andrexpert/article/details/53105297 |
情景再现:“最近有个项目需要数据库升级,看了下项目源码使用的是GreenDao开源框架。由于之前没有接触过,就打算在网上找些资料了解下,但找了半天发现大部分都是蜻蜓点水似的介绍了下,有点甚至就直接贴官方Demo,并且基本上都是介绍AndroidSudio平台的。经过对GreenDao框架了解,发现确实是个非常不错的项目,算是主流的数据库ORM框架中较好的。经过一方摸索,我发现这个框架表面上看起来很复杂,但是只要你把从项目构建、API使用的流程走一边之后就很容易上手了。出于学习和总结的目的,也方便其他当初像我一样的刚接触的人能够快速入手,打算写几篇文章以形成一个系列,虽然不是很深,但是自己会不断的进行深入的理解和使用,同时也会更新博客以记录之。”
GreenDAO是一个轻量、快速的Android SQLite对象关系映射(ORM,Object RelationalMapping)数据库解决方案,它帮助开发者能够快速地将Java对象映射到SQLite数据库的表单中,并借助相关的API和Java对象实现对SQLite数据库进行增删改查。通俗来说,GreenDAO就是一个SQLite数据库操作开源框架,通过这个框架能够自动生成与数据库操作相关的实体层(Entity)和DAO层,从而使得开发者无需再去写大量的数据库操作相关的代码,如创建SQLiteHelper、编写DAO层、对Cursor操作等。示意图如下:
1.项目框架
(1) DaoCore | GreenDAO内核程序,是一个Java程序,为最后项目中依赖的库。 |
(2) DaoGenerator | 实体(Entity)和DAO层代码生成器(Java项目) |
(3) DaoExample | 使用GreenDAO Demo(Android) |
(4) DaoExampleGenerator | 代码生成器Demo(Java项目) |
(5) DaoTest | 测试Demo(Android项目) |
(6) DaoTestGenerator | 代码生成器测试Demo(Java项目) |
源码下载地址: https://github.com/greenrobot/greenDAO
2.构建Eclipse Android DAO项目
GreenDAO框架的使用关键在于两个方面:一是新建一个Java项目并依赖DaoGenerator生成与数据库表相对应的实体类和DAO层代码,二是新建Android项目并依赖DaoCore项目。
经过一番摸索,这里我提供两种方式来构建基于Eclipse平台的GreenDAO应用项目:在Java项目和Android项目中分别引入DaoGenerator.jar&freemarker.jar包和DaoCore.jar包;手动构建DaoGenerator项目和DaoCore项目,并将其作为新建Java项目和Android项目的依赖。
首先,来个最简单的,在新建Java项目和Android项目直接引入jar包。
(1)新建Android项目,将DaoCore-1.3.0.jar、sqlcipher.jar拷贝到libs目录即可。
(2)新建Java项目并添加libs目录,将freemarker.jar、greendao-generator-2.1.0.jar拷贝至该目录,再通过”Java Build Path->Libraries->Add JARs”方法导入jar包。
创建DaoDemoGenerator工程的目的就是生成Android项目所需的实体类和DAO层,因此,DaoDemoGenerator.java的作用就是指定生成代码的存放路径、实体类和DAO层代码所属包名以及创建与数据库表相对应的实体类及其属性等。现在我们就参照GreenDAO项目中的DaoExampleGenerator示例,来创建DaoDemoGenerator.java,代码如下:
/**
*@dscrible Java项目,用于生成Android项目所需的实体和DAO层
*
* Created by jiangdongguo on 2016-11-7 下午10:15:13
*/
public class DaoDemoGenerator {
public static void main(String[] args) throws IOException, Exception {
//设置实体类包名,其中com.example.greendaodemo1是Android项目包名
Schema schema = new Schema(1, "com.example.greendaodemo.bean");
//设置DAO层包名
schema.setDefaultJavaPackageDao("com.example.greendaodemo.dao");
//创建三个与数据库表相对应的实体类
addNote(schema);
//生成代码后存放的路径,GreenDaoDemo是Android项目
new DaoGenerator().generateAll(schema, "../GreenDaoDemo1/src");
}
private static void addNote(Schema schema){
//实体类
Entity personInfo = schema.addEntity("PersonInfo");
//添加id属性
personInfo.addIdProperty();
//依次添加name、age、sex、phone、address属性
personInfo.addStringProperty("name").notNull();
personInfo.addIntProperty("age");
personInfo.addStringProperty("sex").notNull();
personInfo.addIntProperty("phone");
personInfo.addStringProperty("address").notNull();
//实体类
Entity carInfo = schema.addEntity("CarInfo");
//添加id属性
carInfo.addIdProperty();
//依次添加brand属性
carInfo.addStringProperty("brand").notNull();
carInfo.addStringProperty("model");
carInfo.addIntProperty("price").notNull();
carInfo.addStringProperty("date");
carInfo.addStringProperty("place").notNull();
//实体类
Entity workInfo = schema.addEntity("WorkInfo");
//添加id属性
workInfo.addIdProperty();
workInfo.addStringProperty("company").notNull();
workInfo.addStringProperty("address").notNull();
workInfo.addIntProperty("number");
}
}
执行运行DaoDemoGenerator工程(Run As->Java Application),即可在Android项目中生成如下文(需F5刷新Android项目,且该项目是已经先存在的):
DaoMaster:可理解为DAO管理员,它保存了SQliteDatabase对象以及操作DAO Classes,并提供了一些创建和删除table的静态方法,其内部类OpenHelper和DevOpenHelper实现了SQLiteOpenHelper并创建数据库的框架。
DaoSession:会话层。用于获得能够操作数据库的xxxDao对象,如PersonInfoDao。
PersonInfoDao等:生成器生成的DAO类,具有更多的权限和方法来操作数据库元素。也就是说,我们对数据库 PersonInfo表的增删改查方法都应该在这个类中实现。
PersonInfoEntity等:持久的实体对象,即bean目录下的实体类,可理解为用于封装与数据库PersonInfo表字段对应的相关属性。
其次,来个复杂点的,手动导入DaoGenerator项目和GreenDao项目。
由于DaoGenerator项目、DaoCore是在AndroidStudio使用gradle构建,目前无法直接将其导入到Eclipse中,我们需要手动导入这两个项目。
(1)手动导入DaoGenerator项目到Eclipse。创建一个Java项目,将src和src-template目录拷贝到项目中,并引入freemarker.jar包。
(2)新建一个Java项目作为Android项目的代码生成器,并依赖于DaoGenerator,可通JavaBuild Path->Projects->DaoGenerator实现。
然后,我们再在该Java项目src目录中创建DaoDemoGenerator类(类名自定义),用于生成所需的实体和DAO层代码。
/**
*@dscrible Java项目,用于生成Android项目所需的实体和DAO层
*
* Created by jiangdongguo on 2016-11-7 下午10:15:13
*/
public class DaoDemoGenerator {
public static void main(String[] args) throws IOException, Exception {
//设置实体类包名
Schema schema = new Schema(23, "com.example.greendaodemo1.bean");
//设置DAO层包名
schema.setDefaultJavaPackageDao("com.example.greendaodemo1.dao");
//定义实体类
addNote(schema);
//生成代码后存放的路径
new DaoGenerator().generateAll(schema, "../GreenDaoDemo1/src");
}
private static void addNote(Schema schema){
//实体类
Entity personInfo = schema.addEntity("PersonInfo");
//添加id属性
personInfo.addIdProperty();
//依次添加name、age、sex、phone、address属性
personInfo.addStringProperty("name").notNull();
personInfo.addIntProperty("age");
personInfo.addStringProperty("sex").notNull();
}
注:实际上,这里的代码与上面所述的一样的,只是方便再次理解。
(3)手动导入DaoCore项目到Eclipse。创建一个Android项目,并将包名命名为” org.greenrobot.greendao”,然后再将GreenDAO项目中的DaoCore里greendao的所有源码拷贝到包里,最后分别将sqlcipher.jar、rxjava-1.0.10.jar引入到该Android项目中。其中,还需要将GreenDAO项目源码中的..\greenDAO-master\greendao-api目录下的annotation、converter目录源码拷贝到包中,否则会报错。
(4)新建一个Android项目,并依赖于DaoCore工程,可通过Java Build Path->Projects->DaoCore实现。
最后的话:“(1)表面上看方法二有点复杂,其实就是“2个Java项目,2个Android项目”的问题。“2个Java项目”,其一是为了导入GreenDAO框架的生成器核心源码,它将作为依赖库存在;其二是为了生成最终与数据库对应的实体和DAO层代码。“2个Android项目”,其一是为了导入GreenDAO框架的DaoCore核心源码,它将作为依赖库;其二就是我们自己将要开发的Android应用项目。 (2)GreenDao项目是一个非常优秀的数据库ORM框架,除了拥有高性能、低消耗、易于使用的APIs等优点,它对有关数据库的操作进行了深度封装,且是完全面向对象的。也就是说,你基本可以不与SQL语句打交到就可以非常方便、简单地实现对数据库的操作,当然,前提是你要熟悉如何去驾驭它~ ”
关于资料与Demo:
GreenDao官方文档:http://greenrobot.org/greendao/
GreenDAO源码:https://github.com/greenrobot/greenDAO
GreeDao相关jar包:
* greendao-generator.jar:http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22greendao-generator%22
* rxjava.jar:https://jcenter.bintray.com/io/reactivex/rxjava/1.0.10/rxjava-1.0.10.jar
* freemarker.jar:http://freemarker.incubator.apache.org/
* DaoCore-1.3.0.jar:http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22DaoCore%22