天天看点

Android MVPBuilder第三篇[GreenDao]

- [ MVPBuilder Github 下载地址]

今天我们引入数据库开源框架GreenDao,它是非常优秀的ORM框架。先来看看今天要关注的工程目录结构:

Android MVPBuilder第三篇[GreenDao]

就是箭头所指的那几个文件。其中只有绿色的是我们要写的,其它都是自动生成的!!要知道程序员是世界上最懒而生物,还是那句,不要自己造轮子,还是那句,抽象抽象抽象。所有项目的数据库操作都最后变为增,删,改,查。所以才会有Dao这个概念的提出,再把操作数据库抽象封装起来,让程序员不用懂sql语句。当然,作为基本的素养,sql语句是必须要了解的。

- [ GreenDao 官网]

情景假设

我们的APP要创建一个User表,这个表有OID,Name,Sex这几个字段,然后需要对这个表进行增删改查。简单三步,OK!

  1. 编写生成器DaoGenerator
  2. 执行生成器生成文件
  3. 编写Api接口
  4. 使用增删改查功能

第一步:

创建一个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(, "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的函数,然后把字段加进去,再执行。总之箭头所指的两个地方的代码都是自动生成的,尽量不要改动。

Android MVPBuilder第三篇[GreenDao]

第三步:

编写自己的接口。虽然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处去改。下一篇我们继续来调试增删改查功能吧,这些其实官网都有~