- [ MVPBuilder Github 下载地址]
今天我们引入数据库开源框架GreenDao,它是非常优秀的ORM框架。先来看看今天要关注的工程目录结构:
就是箭头所指的那几个文件。其中只有绿色的是我们要写的,其它都是自动生成的!!要知道程序员是世界上最懒而生物,还是那句,不要自己造轮子,还是那句,抽象抽象抽象。所有项目的数据库操作都最后变为增,删,改,查。所以才会有Dao这个概念的提出,再把操作数据库抽象封装起来,让程序员不用懂sql语句。当然,作为基本的素养,sql语句是必须要了解的。
- [ GreenDao 官网]
情景假设
我们的APP要创建一个User表,这个表有OID,Name,Sex这几个字段,然后需要对这个表进行增删改查。简单三步,OK!
- 编写生成器DaoGenerator
- 执行生成器生成文件
- 编写Api接口
- 使用增删改查功能
第一步:
创建一个Java Module,然后新建一个可执行的DaoGenerator类,注释已经非常清楚了,这个生成器是用来生成程序中使用的实体bean或者叫POJO或者叫Entity,反正就是一个类,这个类是对你业务里某些东西的封装,这里就是用户类和用户表的映射。
package com.yihukurama.daogener;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;
public class DaoGenerator {
public static void main(String[] args) throws Exception {
// 正如你所见的,你创建了一个用于添加实体(Entity)的模式(Schema)对象。
// 两个参数分别代表:数据库版本号与自动生成代码的包路径。
// Schema schema = new Schema(1, "me.itangqi.greendao");
// 当然,如果你愿意,你也可以分别指定生成的 Bean 与 DAO 类所在的目录,只要如下所示:
Schema schema = new Schema(1, "com.yihukurama.www.mvpbuilder.framework.m.dao.bean");
schema.setDefaultJavaPackageDao("com.yihukurama.www.mvpbuilder.opensource.greendao");
// 模式(Schema)同时也拥有两个默认的 flags,分别用来标示 entity 是否是 activie 以及是否使用 keep sections。
// schema2.enableActiveEntitiesByDefault();
// schema2.enableKeepSectionsByDefault();
// 一旦你拥有了一个 Schema 对象后,你便可以使用它添加实体(Entities)了。
UserTable(schema);
// 最后我们将使用 DAOGenerator 类的 generateAll() 方法自动生成代码,此处你需要根据自己的情况更改输出目录(既之前创建的 java-gen)。
// 其实,输出目录的路径可以在 build.gradle 中设置,有兴趣的朋友可以自行搜索,这里就不再详解。
new de.greenrobot.daogenerator.DaoGenerator().generateAll(schema, "/workspace/androidstudio/MVPBuilder/app/src/main/java/");
}
private static void UserTable(Schema schema) {
// 一个实体(类)就关联到数据库中的一张表,此处表名为「User」(既类名)
Entity User = schema.addEntity("User");
// 你也可以重新给表命名
// note.setTableName("User");
// greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值
// 接下来你便可以设置表中的字段:
User.addIdProperty();
User.addStringProperty("Oid").notNull();
User.addStringProperty("Name");
User.addStringProperty("Sex");
}
}
第二步:
执行这个生成器,然后在对应的目录下就会生成代码。对应地生成箭头所指的代码。想一下未来要增加一个好友信息表怎样?那就是再加一个FriendsTable的函数,然后把字段加进去,再执行。总之箭头所指的两个地方的代码都是自动生成的,尽量不要改动。
第三步:
编写自己的接口。虽然greendao已经很好用了,完全可以在代码中使用它的方法,但是作为一个聪明的程序员,还是应该把非业务的代码做一次封装,所有业务情况需要用到greendao的都要通过这个接口调用。这里新建一个DaoApi接口。
/*
ShengDao Android Client, DBManager
Copyright (c) 2014 ShengDao Tech Company Limited
*/
package com.yihukurama.www.mvpbuilder.opensource.api;
import android.content.Context;
import com.yihukurama.www.mvpbuilder.opensource.greendao.DaoMaster;
import com.yihukurama.www.mvpbuilder.opensource.greendao.DaoSession;
/**
* [数据库管理类,数据采用GreenDao来实现,所有实现通过模板自动生成;通过获取daoSession来获取所有的dao,从而实现操作对象]
*
* @author yihukurama
* @version 1.0
* @date 2014-11-6
*
**/
public class DaoApi {
private static String DB_NAME = "tempDB";
private static DaoApi instance;
private DaoMaster daoMaster;
private DaoSession daoSession;
public static DaoApi getInstance(Context context) {
if (instance == null) {
synchronized (DaoApi.class) {
if (instance == null) {
instance = new DaoApi(context);
}
}
}
return instance;
}
/**
* 构造方法
* @param context
*/
private DaoApi(Context context) {
if(daoSession == null){
if(daoMaster == null){
DaoMaster.OpenHelper helper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
daoMaster = new DaoMaster(helper.getWritableDatabase());
}
daoSession = daoMaster.newSession();
}
}
public DaoMaster getDaoMaster() {
return daoMaster;
}
public void setDaoMaster(DaoMaster daoMaster) {
this.daoMaster = daoMaster;
}
public DaoSession getDaoSession() {
return daoSession;
}
public void setDaoSession(DaoSession daoSession) {
this.daoSession = daoSession;
}
public void reset(){
instance = null;
daoMaster = null;
daoSession = null;
}
}
第四步:
大功告成,只剩调试[增删改查]。别急,先体会一下greendao带给我们什么,不用写sql语句,不用自己建表等等,让我们专注业务。这其实跟java的hibernate等是异曲同工之妙。第四步增删改查就留到下一节。记住,任何不是自己编写的代码,都要用一个中间的接口来调用,因为如果程序中有1000处调用,如果不用接口,到时候人家升级了,函数名变了,你想升级就要改1000处了,或者说你想换个框架,我不用greendao了,我突然想试试reddao看看性能怎样,也是改接口就行了,不用找1000处去改。下一篇我们继续来调试增删改查功能吧,这些其实官网都有~