史上最全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();
}
好了代码就放这么多吧,其他的方法也是一样,包括里面用的异步查找,按照这样的方式 一步步看看很直观。
以上是本人查看源码的总结的,本人能力有限,肯定有很多错误的地方,理解不到位的地方,还请大神们指出来,共同进步。。
猛戳这里点击关注公众号⬇️ 即可了解我们更多: