GreenDAO是一个对象关系映射(ORM)的框架,它能够提供一个接口通过操作对象的方式去操作关系型数据库,能够使操作数据库时更简单、更方便。
GreenDao相比与其他的ORM型数据库,具有的优点有:
1.依赖体积小(100KB左右)
2.最小的内存开销
3.易于使用的API
4.支持数据库加密
结合自己的了解,将这个框架整合了一下:支持增删改查,数据库存储路径设置,数据库升级以及遇到的坑等,基本可以满足95%以上的项目需求。项目的地址如下:
GitHub:点击下载
优快云:点击下载
GreenDao原理
GreenDao中,DaoMaster.DevOpenHelper源码如下:
/** WARNING: Drops all table on Upgrade! Use only during development. */
public static class DevOpenHelper extends OpenHelper {
public DevOpenHelper(Context context, String name) {
super(context, name);
}
public DevOpenHelper(Context context, String name, CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
dropAllTables(db, true);
onCreate(db);
}
}
点击super,如下:
可以发现:其实GreenDao也是基于原生SQLiteOpenHelper进行了封装,最后还是调用了原生的API。继承SqliteOpenHelper的原生数据库,我们会编写大量的Dao文件、SQL语句以及需要关注cursor的关闭时机以及事物管理等等,但是这些事情GreenDao帮我们很好的处理了,我们只需要关注逻辑的实现即可,从而加快了我们的开发效率。
GreenDao的使用:
1.1 配置
项目的build.gradle:
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
app的build.gradle:
apply plugin: 'org.greenrobot.greendao'
greendao {
// 指定数据库schema版本号,迁移等操作会用到
schemaVersion 1
// 通过gradle插件生成的数据库相关文件的包名,默认为你的entity所在的包名
daoPackage 'com.john.johngreendao.greendao.dao'
// 生成的数据库文件默认目录为:build/generated/source/greendao
// 自定义生成数据库文件的目录,可以将生成的文件放到java目录中,而不是build中,这样就不用额外的设置资源目录了
targetGenDir 'src/main/java'
}
dependencies:
implementation 'org.greenrobot:greendao:3.2.0'
1.2 新建Entity实体类:
@Entity
public class Customer {
@Id(autoincrement = true)
private Long id;
private String name;
private int age;
//新加字段
private String sex;
//新加字段
private String like;
public String getLike() {
return like;
}
public void setLike(String like) {
this.like = like;
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
关于greenDao的一些注解以及意义如下,可以参考一下:
@Entity:它会把当前类映射成默认以类名为表名的数据库表,每一个Entity对象对应着数据库表中的一行记录。当然像表名这些关于数据库表的设置也可以在 @Entity中进行设置。
@nameInDb 在数据库中的名字,如不写则为实体中类名
@indexes 索引
@createInDb 是否创建表,默认为true,false时不创建
@schema 指定架构名称为实体
@active 无论是更新生成都刷新
@Id 每条数据对应的位置,必写项
@Property:通过这个注解可以设置列名,默认是将属性名的写法转换成数据库中全大写的写法,如果不设置property属性列名就是NAME,如果有多个单词的话,每个单词中间会有下划线分隔开,前提是属性名是标准的驼峰命名法,这样才能识别每个单词。
@NotNull:限制这个列的插入不能为空
@Unique 唯一约束 该属性值必须在数据库中是唯一值