背景
通过Android数据库——SQLite 可以看出尽管Android已经为我们提供了sqlite数据库内核,但我们要想操作数据库还需要自己拼sql,在大量的增删改查中拼sql这种操作显然是大大降低了我们的工作效率,因此Android的 orm(Object/Relational Mapping) 框架应运而生。大概在15、16年前后出现了大量的这种框架,而选择greendao的伙伴们大概都是因下面这张图:
那时候还是greendao2.0的时代,aop 还没那么普遍(额,现在不用aop都不敢称为框架了),greendao的集成方式相对其他框架而言算是比较复杂的。但为了更好的用户体验,我们伟大的Android开发工程师还是选择了它。
GreenDao 2.0集成
上面说它集成有些复杂,我们来看看是要如何集成
- 创建一个java项目
为了操作方便,最好和当前的Android项目在同一个project下 - 在java项目中添加greendao的依赖
compile 'de.greenrobot:greendao-generator:2.1.0'
- 在java项目的main方法中完成以下操作
执行该main方法,则会在Android项目的com.fcat.cloud.bean的目录下生成UserInfo类,里面包含了上面生成的字段及字段的get、set方法。在com.fcat.cloud.dao下面生成DaoMaster、DaoSession、UserInfoDao三个类,如果这些代码都成功生成,说明集成成功。public static void main(String[] arg) { // 7 为数据库版本号 // "com.fcat.cloud.bean" 为Android项目中bean存放目录,greendao会自动在该目录下生产bean Schema schema = new Schema(7, "com.fcat.cloud.bean"); //dao生成的目录 schema.setDefaultJavaPackageDao("com.fcat.cloud.dao"); //添加要存放的实体类 Entity user = schema.addEntity("UserInfo"); //该实体存放的表的名称 user.setTableName("userTable"); //表中的字段(类的属性) user.addStringProperty("nickName"); user.addIntProperty("sex"); user.addStringProperty("birthday"); //添加userName,并将其设置为主键 user.addStringProperty("userName").primaryKey(); // /aaa/bbb 为Android项目所在目录 new DaoGenerator().generateAll(schema, '/aaa/bbb'); }
GreenDao 3.0集成
从上面我们了解到要使用GreenDao2.0需要创建个java项目,而这个java项目的工作就是自动生成代码。早期很多orm框架都是用注解+反射来实现这个步骤的,而反射的性能是比较低的。GreenDao的java项目正是解决了这个低效问题,但作为开发者来说,我们并不想维护这个java项目,而GreenDao 3.0中使用aop技术帮我们解决了这个问题。
- 在项目中添加GreenDao 3.0的依赖
implementation 'org.greenrobot:greendao:3.1.0' implementation 'org.greenrobot:greendao-generator:3.1.0'
- 在gradle中配置版本信息
在project的gradle中添加
在app的gradle中添加classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0'
apply plugin: 'org.greenrobot.greendao' greendao { // 数据库schema版本号 schemaVersion 3 // 生成的dao的包名 daoPackage 'com.fcat.cloud.dao' // 生成的dao的存放路径 targetGenDir 'src/main/java' }
- 编辑要存入数据库的类
OK,这样就可以了。GreenDao 3.0 的集成跟其他orm的框架还是很相似的。// GreenDao会根据@Entity注解来生成对应的数据表,表名默认为类名,可以使用nameInDb进行更改 @Entity(nameInDb = "userTable") public class UserInfo{ public String userName; public String nickName; public int sex; public String birthday; }
GreenDao使用
GreenDao在使用上2.0和3.0还是保持一致的。数据的增删改查都是通过dao来执行,dao则是通过daoSession来获取,整体调用链是:
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "cloud", null);
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
UserInfoDao userinfoDao = daoSession.getUserInfoDao()
拿到dao之后,我们就可以直接调用里面的insert、update、delete等方法。
GreenDao前景
关于greendao的前景,我并不看好,就目前而言,greendao还不支持kotlin,而且谷歌的 jetpack 也包含了数据库操作的组件 Room,同时文档中还提供了数据库迁移的解决方案。