2019独角兽企业重金招聘Python工程师标准>>>
目前android开发刚学习了一个多月,最近开始研究三方开源框架的用法。了解android开发的人应该都会知道,android的数据库开发主要用到sqlite(如果这点你不清楚,那这篇文章就直接pass吧)。greenDAO应该算是当前最火的数据库开源框架了吧,它是一个移动开发的ORM(object / relational mapping)框架,至于ORM是什么,可以百度之,本人理解也不是很深,大概意思就是为懒人设计的能够将对象和关系以映射的方式表达出来。greenDAO就是如此:
greenDAO will do the word for you: it maps Java objects to datebase tables(often called ORM). 这样开发人员就可以吧精力集中在软件开发上,减轻了"wrting sql and parsing query results" 等等这些"quite tedious tasks".
总之,一句话,greenDAO就是实现Java对象和SQLite Datebase的一个媒介人,简化了SQLite的操作。
注:官方网站http://greendao-orm.com/
1. 下载greenDAO
要使用肯定要先下载他的软件包了,官网上有它的连接,对于marven和gradle环境直接到serarch.maven.org上下载jar包就好了。
下载的jar导入到工程里面就可以了,通常都是/libs目录下。
2. 前言
(1)generator --- greenDAO-generator.jar
网上使用说明很少,搜到的都是对于我这个新人来说看的云里雾里,于是本人就干脆直接看官方文档,这篇文章也是边看边写的,可能会有些混乱。
在github上下载的实例源码以及上面图中我们都会发现,会有一个generator。比如包里面会有greendao和greendao-generator,示例工程会有DaoExample和DaoExampleGenerator两个工程。之前一直不明白,看了官方文档终于理解了。
“In order to use greenDao in your project, you need to create a second project, the "generator project". 这个额外的工程是一个普通的java工程,而非android工程。它的任务是生成你希望的java对象所对应的DAO接口对象。
(2)核心的class -- greenDAO.jar
DAO的core library(greenDAO.jar)中有以下几个核心类,也是后面比用到的,先来大概了解下他们的结构吧,不然直接看他们的使用会云里雾里。
DaoMaster:一看名字就知道它是Dao中的最大的官了。它保存了sqlitedatebase对象以及操作DAO classes(注意:不是对象)。其提供了一些创建和删除table的静态方法,其内部类OpenHelper和DevOpenHelper实现了SQLiteOpenHelper并创建数据库的框架。
DaoSession:会话层。操作具体的DAO对象(注意:是对象),比如各种getter方法。
XXXDao:实际生成的某某DAO类,通常对应具体的java类,比如NoteDao等。其有更多的权限和方法来操作数据库元素。
XXXEntity:持久的实体对象。通常代表了一个数据库row的标准java properties。
如下一个实例初始化代码:
helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
noteDao = daoSession.getNoteDao();
即:先创建了一个SQLiteOpenHelper并创建连接到一个具体数据库;再根据具体的datebase创建一个master对象用于;最后通过master创建一个数据库的会话操作。
3. 创建generator工程
(1)创建Java工程
(2)导入greenDao-generator.jar和freemarker.jar两个包。
freemarker是一个用java写的模板引擎,它能够基于模板来生成文本输出。应该就是用来自动生成DAO文件的。eclipse下面就是在 properties --> Java build path --> libraries下面导入jar包。
(3)创建schema
这个不知道怎么业内怎么翻译的,暂时先翻译成”框架“吧。即搭建自己应用的数据库框架,包括table。
创建schema时需要制定数据库的版本号、默认的Java package等参数。
Schema schema = new Schema(1, "de.greenrobot.daoexample");
默认Java package用来存放生成的entity、DAO文件、test代码。但也可以重新制定test文件的单独路径以及DAO文件的路径,代码:
schema.setDefaultJavaPackageTest("de.greenrobot.daoexample.test");
schema.setDefaultJavaPackageDao("de.greenrobot.daoexample.dao");
另外,还有两个flag,用来标示entity是否是activie以及是否使用keep sections。代码:
schema2.enableKeepSectionsByDefault();
schema2.enableActiveEntitiesByDefault();
Keep sections:因为entity class在每次generator执行时均会覆盖原来的程序,为了能够添加用户自定义代码到entity中,需要设置该参数。只需要把自己的代码添加到下面的KEEP[]块中间就可以了。
// KEEP INCLUDES - put your custom includes here
// KEEP INCLUDES END
...
// KEEP FIELDS - put your custom fields here
// KEEP FIELDS END
...
// KEEP METHODS - put your custom methods here
// KEEP METHODS END
(4)创建entity
schema中可以添加entity,简单的理解应该是entity对应一个具体的java class,entity可以添加property。Entity通常也是对应一个table。除了添加property之外,entity也可以添加to-one和to-many关系,即添加一对一的关系和一对多的关系。
下面就直接贴一个官方示例的代码吧:
public static void main(String[] args) throws Exception {
Schema schema = new Schema(3, "de.greenrobot.daoexample");
addNote(schema);
new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");
}
private static void addNote(Schema schema) {
Entity note = schema.addEntity("Note");
note.addIdProperty();
note.addStringProperty("text").notNull();
note.addStringProperty("comment");
note.addDateProperty("date");
}
系统会自动以传入的参数作为表的名字,但也可以自定义表名称:note.setTableName("NoteTable");
(5)生成DAO文件
生成DAO文件就是使用main函数的最后一句话,其中后面的参数就是希望自动生成的代码对应的项目路径。
new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");
注:设置的路径必须存在,否则会抛出异常。该路径是另外的工程下面的目录,当然也可以自己不这么做,只要这个目录存在就行。在schema创建的时候指定的package接口也是相对于该路径的。
执行generator工程,会发现生成了DaoMaster、DaoSession、NoteDao、Note共4个类文件,Note是一个纯Java类,内部各种getter和setter接口均自动创建实现了。NoteDao文件则是创建Note这个表的各个接口,包括sql语句等。很神奇很方便哈!!
4. 创建基于greenDao的android工程
完成了generator工作之后后面的东西就简单了:
(1)创建一个android工程
(2)插入一个Note对象:
DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
noteDao = daoSession.getNoteDao();
Note note = new Note(null, noteText, comment, new Date());
noteDao.insert(note);
noteDao.deleteByKey(id);
真的是so easy!!