核心:
首先明确一点,sqlite操作都是依靠sql语句的,所以 greendao的所有api及实现都是为这个准则服务的。
变化:
3.0之前需要通过新建GreenDaoGenerator工程生成Java数据对象(实体)和DAO对象,非常的繁琐而且也加大了使用成本。
GreenDao 3.0最大的变化就是采用注解的方式通过编译方式生成Java数据对象和DAO对象。
DatabaseOpenHelper也是实现了SQLiteOpenHelper的一个帮助类,它内部可以获取到两种不同的数据库类型,一种是标准型的数据库StandardDatabase,另一种是加密型的数据库EncryptedDatabase
基本原理:
传入对象,实现sql拼接。
为每一个EntityDao字节码对象建立与之对应的db数据库的映射关系,从而管理所有的EntityDao类。
建立特定模式下的所有的DAO对象和数据库db对象的映射,管理特定模式下的所有DAO对象,并提供一些通用的CRUD持久化方法。
特点:
首先,它通过使用自身的插件配套相应的freemarker模板生成所需的静态代码,避免了反射等消耗性能的操作。其次,它内部提供了实体数据的映射缓存机制,能够进一步加快查询速度。对于不同数据库对应的SQL语句,也使用了不同的DataBaseStatement实现类结合代理模式进行了封装,屏蔽了数据库操作等繁琐的细节。最后,它使用了sqlcipher提供了加密数据库的功能,在一定程度确保了安全性,同时,结合RxJava,我们便能更简洁地实现异步的数据库操作。
延申:
数据库升级是怎么实现的?
GreenDao的升级思路:
- 创建临时表TMP_,复制原来的数据库到临时表中;
- 删除之前的原表;
- 创建新表;
- 将临时表中的数据复制到新表中,最后将TMP_表删除掉;
GreenDao 对当然也是对提供对 Rxjava 的支持(只是支持版本上有待同步)
多线程环境下怎么保证数据安全的?(sqlite本身不支持多线程读写)
crud的效率是如何做到提升的?