史上最全greendao源码解析



greendao 是目前很流行的一个数据库,既然那么流行,那么多人用,我们就来看看它的实现的原理,它的优势所在。

如果还不知道怎么配置的,请看我的上一篇博客。


先不多说,上一个类的结构图,一目了然:



这是greendao的使用入口

 DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(getApplicationContext(), "MMCD.db", null); //SQLiteOpenHelper
 DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDb());
        daoSession = daoMaster.newSession();

一般这个是放在Application里面,得到session那么就可以操作数据库了,也可以拿到dao 再对数据库进行crud,至于类与类之间的关系,上面的图已经很清楚,就不再这里赘述了。



greendao牛逼之处在于可以直接传入对象进行crud,非常灵活,后面最终的操作还是拼接的sql,让我慢慢来揭开它的神秘面纱。


在DaoSession 初始化的时候,registerDao(User.class, userDao);将实体和dao注册在map中,一边后边通过对象获取dao,

这样在DaoSession 中也可以调用dao的方法对数据库进行操作。



看看代码很直观,简单易懂。

/** Convenient call for {@link AbstractDao#loadAll()}. */
    public <T, K> List<T> loadAll(Class<T> entityClass) {
        @SuppressWarnings("unchecked")
        AbstractDao<T, K> dao = (AbstractDao<T, K>) getDao(entityClass);
        return dao.loadAll();
    }



    public AbstractDao<?, ?> getDao(Class<? extends Object> entityClass) {
        AbstractDao<?, ?> dao = entityToDao.get(entityClass);
        if (dao == null) {
            throw new DaoException("No DAO registered for " + entityClass);
        }
        return dao;
    }





回到dao中,首先dao的loadAll(查询所有数据) 直接调用的

 /** Loads all available entities from the database. */
    public List<T> loadAll() {
        Cursor cursor = db.rawQuery(statements.getSelectAll(), null);
        return loadAllAndCloseCursor(cursor);
    }


 /** ends with an space to simplify appending to this string. */
    public String getSelectAll() {
        if (selectAll == null) {
            selectAll = SqlUtils.createSqlSelect(tablename, "T", allColumns, false); //不出意外这个是在拼接sql
        }
        return selectAll;
    }


sql拼接关键代码



   /** Creates an select for given columns with a trailing space */
    public static String createSqlSelect(String tablename, String tableAlias, String[] columns, boolean distinct) {
        if (tableAlias == null || tableAlias.length() < 0) {
            throw new DaoException("Table alias required");
        }


        StringBuilder builder = new StringBuilder(distinct ? "SELECT DISTINCT " : "SELECT ");
        SqlUtils.appendColumns(builder, tableAlias, columns).append(" FROM ");
        builder.append('"').append(tablename).append('"').append(' ').append(tableAlias).append(' ');
        return builder.toString();
    }


好了代码就放这么多吧,其他的方法也是一样,包括里面用的异步查找,按照这样的方式 一步步看看很直观。


以上是本人查看源码的总结的,本人能力有限,肯定有很多错误的地方,理解不到位的地方,还请大神们指出来,共同进步。。




猛戳这里点击关注公众号⬇️ 即可了解我们更多:





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值