GreenDao系列之(3)我的扩展

简介: # GreenDao的不足 之前也提到过,greenDao有以下不足: 1. greenDao Generator仍然有点笨 2. greenDao的DaoMaster对数据库的创建和更新比较笨拙,无法实现智能更新。虽然网上有一个叫做MigrationHelper的解决方案,但仍不够友好。 3. greenDao的Property支持的属性有限,不支持default、is null、uni

GreenDao的不足

之前也提到过,greenDao有以下不足:

  1. greenDao Generator仍然有点笨
  2. greenDao的DaoMaster对数据库的创建和更新比较笨拙,无法实现智能更新。虽然网上有一个叫做MigrationHelper的解决方案,但仍不够友好。
  3. greenDao的Property支持的属性有限,不支持default、is null、unique 等属性
  4. greenDao不支持Property更新,只支持整个对象的更新

由于精力有限,我只会对第2-4点进行改进。

我的改进

针对以上几点,进行了几点改进:

  1. 支持更多属性设置:如NOT NULL、UNIQUE
  2. 支持Index配置,定义Index就和定义Property一样简单
  3. 数据库自动化升级
  4. 数据库支持属性更新

同时,为了享有后面greenDao开源的维护的成果,我们在保持greenDao独立性的基础上进行了扩展,而不进行修改。

因此,进行如下设计:

DaoPropery

我们扩展了Propery,丰富property的属性

public final int ordinal; //索引
public final Class<?> type; //类型: String、Long、Integer
public final String name; //名称,没啥实际作用
public final boolean primaryKey; //是否主键
public final String columnName; //列名称,对应数据库的表的真实column名
public boolean mIsUnique; //是否唯一
public boolean mIsNotNull; //是否非空

Index

新增了Index,允许开发者定义Index就能增加索引

public class Index {

    public String mType; //索引类型,如UNIQUE
    public String mName;
    public DaoProperty[] mColumnList;

    public Index(String aType, String aName, DaoProperty... aColumnList) {
        mType = aType;
        mName = aName;
        mColumnList = aColumnList;
    }

    public Index(String aName, DaoProperty... aColumnList) {
        this("", aName, aColumnList);
    }
}

AbstractDaoManager

我们引入了AbstractDaoManager,它管理着DaoMaster所能管理的以及不能管理的工作。它和DaoMaster最主要的区别在于数据库自动创建及升级

数据库自动创建有以下功能:

  1. 根据所定义的Property自动创建Table
  2. 根据所定义的Index自动创建

数据库自动升级有以下功能:

  1. 根据所定义的Property进行升级。开发者无需关心表中column的新增,每次数据库升级时,AbstractDaoManager会根据table新增的column自动创建
  2. 根据所定义的Index进行升级。同上

关键代码如下:

    @Override
    public void onCreate(Database db) {
        try{
            db.beginTransaction();
            for (Class daoCls : sDaoClasses) {
                DaoConfig daoConfig = getDaoConfig(db, daoCls);
                //创建table
                db.execSQL(SqlUtils.createTableSql(daoConfig));
                //创建索引
                SqlUtils.executeUpdateTableIndexSql(db ,daoCls, daoConfig);
            }
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }

    }

    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {
        try {
            db.beginTransaction();
            for (Class daoCls : sDaoClasses) {
                DaoConfig daoConfig = getDaoConfig(db, daoCls);
                //更新前准备,由业务方去做想做的事情
                onBeforeUpgradeTable(db, oldVersion, newVersion, daoCls , daoConfig);
                //更新表
                db.execSQL(SqlUtils.createTableSql(daoConfig));

                //更新索引
                try {
                    SqlUtils.executeUpdateTableIndexSql(db, daoCls, daoConfig);
                } catch (Exception ex) {
                    onUpgradeIndexError(db, oldVersion, newVersion, daoCls , daoConfig);
                }

                //更新属性
                DaoProperty[] properties = new DaoProperty[daoConfig.properties.length];
                for (int i = 0; i < daoConfig.properties.length; i++) {
                    properties[i] = (DaoProperty) daoConfig.properties[i];
                }
                for (DaoProperty property : properties) {
                    if (!SqlUtils.checkPropertyExist(db, daoConfig.tablename, property)) {
                        db.execSQL(SqlUtils.addDaoPropertySql(daoConfig.tablename, property));
                    }
                }
            }
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
    }

UpdateBuilder

增加BaseDatabaseDao,里面扩展了UpdateBuilder,支持数据库的属性更新

关键代码如下:

public class UpdateBuilder<T> {

    public UpdateBuilder<T> set(DaoProperty aPropertie, Object value) {
        mProperties.add(aPropertie);
        mValues.add(value);
        return this;
    }


    public UpdateBuilder<T> where(WhereCondition cond, WhereCondition... condMore) {

    }

    public UpdateBuilder<T> whereOr(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore) {
  
    }

    public WhereCondition or(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore) {

    }

    public WhereCondition and(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore) {

    }

    public int build() {
    
    }
}

以上就是对GreenDao进行的扩展改造,让greenDao支持更加丰富的功能,使用起来更加的舒服。GreenDao的DaoGenerator,说实话,首次使用价值比较高,非首次也基本没什么价值了。

TODO

  1. 不允许主线程访问数据库
  2. and so on
目录
相关文章
|
Java 数据库 索引
GreenDao3.0版本基础
greenDAO3基本使用 greenDAO3开始使用注解的方式定义实体类(entity),并且是通过安装gradle插件来生成代码。之前的版本则是通过建立一个独立的Java-lib工程来存放生成的文件。
1617 0
|
SQL 缓存 数据库
GreenDao系列之(2)设计及机制介绍
# 总体设计类图 ![这里写图片描述](http://img.blog.csdn.net/20170214183411203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmlsbHBpZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
1788 0
|
SQL Java 数据库
GreenDAO简介
Android本身自带的SQLite,大家一定都用过,然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等。
960 0
|
存储 Java 数据库
小结:greenDAO和LitePal的区别
这两个框架思想都差不多,都是把面向对象映射成关系型语言, 主要区别有以下几个: 1. greenDAO的version等数据库属性设置都是在对应的模型类里面完成的,以Java class的属性变量的形式存储;而LitePal是在另外的一个xml文件中定义。
1452 0
|
SQL Java API
开源数据库框架greenDAO
最近在对开发项目的性能进行优化。由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读写、查询等操作。因此首先想到了对整个项目的数据库框架进行优化。 原先使用android本身内置的sqllite,也就是用的最基本的SQLiteOpenHelper方法,这种方法对自己来说比较方便易懂。但是在使用过程中感觉很繁琐,从建表到对表的增删改查等操作,如果表对象的属性很多,就需要
1247 0
|
数据库 Android开发 开发者
GreenDAO系列之(1)入门
# 关于greenDao ## 简介 greenDAO 是一个开源的ORM数据库框架。它帮助开发者从日常的数据库的读写sql语句中解放出来,开发者只需要关注具体的Java对象,就能够进行数据库的访问操作。 ![image](http://greenrobot.org/wordpress/wp-content/uploads/greenDAO-orm-320.png) ## gree
2751 0
|
9月前
|
安全 Java 程序员
Spring框架的核心特性是什么?
【4月更文挑战第30天】Spring 的特性
489 0
|
数据库
GreenDao教程2
总述: 所有的增删改查都需要通过greendao通过实体对象类生成的Dao来实现, 具体实现如下图 1、初始化数据库操作对象(GreenDao自动生成的操作对象) 2、通过数据库操作对象,进行增删改查操作 Tips 增 添加的记录需要初始化数据对象里面的数据 查 可以多次使用where(),进...
813 0
|
数据库 数据安全/隐私保护 Android开发
GreenDao教程1
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个框架还是不错的。直接面向对象的,可以通过对对象的操作,实现数据的存储。 但是官网上的API是在不敢恭维,文档写的很糙,看了半天,才搞懂一系列的流程。
1359 0

热门文章

最新文章