数据库开源框架GreenDao的使用解析
1,GreenDao概述
1),greenDao是一个当下十分火热的数据库开源框架,或者说是一个帮助Android开发者将数据存到SQLite中的一个开源项目,
也可以说是一个将对象映射到SQLite数据库中的,轻量的,快速的ORM解决方案.
GreenDao是对android原生SQLite的封装,
GreenDao的特色是通过插件自动生成DAO层类!
SQLite:-->SQLite是一个很好的嵌入式关系数据库,
ORM:-->Object Relational Mapping-->对象,关系,映射!
它把Java对象映射到数据表中来称作是ORM!
Orm是对象与数据的映射,简单说就是让javabean和数据库表建立绑定关系!
2)之前开发是通过继承SQLiteOpenHelper实现创建数据库,基本表以及迭代开发中数据库,实现增删改查!
而greenDao使用一个简单的面向对象的接口来存储、更新、删除和查询Java对象,来达到对数据库的增删改查的操作!!
关于greenDAO的其他相关信息可以看官网greenDAO
3)推荐学习资料地址:
GreenDao官网:
http://greenrobot.org/greendao/ GreenDao特征介绍:
http://greenrobot.org/greendao/features/
GreenDao学习文档:
http://greenrobot.org/greendao/documentation/
GreenDao更新日志:
http://greenrobot.org/greendao/changelog/
GreenDao GitHub地址:
https://github.com/greenrobot/greenDAO
2,GreenDao有什么优势
1)性能最高,内存消耗最小,支持数据库加密.
2)一个精简的库,依赖库小于100kb,且使用人数众多,维护者也一直在更新.
3)完善的api,并且对Android进行了高度优化
greenDAO和ORMLite框架的比较:
对于给定相同的实体,greenDAO插入和更新实体的速度是ORMLite的两倍,并且在加载实体方面,它的加载速度比ORMLite快几乎4.5倍,
在一些特殊的应用中,加载速度是至关重要的!
3,GreenDao的特点
1)ORM对象关系映射
GreenDAO就是为存储在关系型数据库SQLite中的数据,提供面向对象的快捷方式.
2)活动实体
如果需要,实体可以被“激活”,而活动实体可以透明地解析关系,并且有更新,删除方法,以便方便地访问持久性功能
也就是由greendao生成的java实体对象可以调用其get,set方法,通过操作对象来实现数据库中数据的增删改查!
3)协议缓冲区支持
GreenDAO可以将协议缓冲区protobuf对象直接保存到数据库中,如果通过protobuf通话到您的服务器,则不需要另一个映射.
常规实体的所有持久性操作都可用于protobuf对象!这是GreenDAO的独特之处,独一无二的特性!!
protobuf:
https://github.com/google/protobuf 4)自动生成代码
使用GreenDao,我们无需关注实体类以及Dao,GreenDao可以为我们自动生成!
意味着GreenDao将会生成Java数据对象(实体)和DAO对象,使用DAO对象以对象映射的方式来操作数据库.
5)加密支持
GreenDao支持加密数据库来保护敏感数据,
加密操作的技术文档:
http://greenrobot.org/greendao/documentation/database-encryption/
6)依赖库微小
物理质量网络统计其大小不超过100kb
可以查看本地缓存的文件位置,查看其大小.
C:\Users\think\.gradle\caches\modules-2\files-2.1\org.greenrobot\greendao\3.2.2\4b0a727cd9b59a7550794f3bec8024cf271b15d
7)性能高,速度快,存储数据量大
8)开源
可以在github查看其源代码,深入了解机制!
4,GreenDao的使用配置
1)配置项目工程根目录下的build.gradle(视图project/项目目录/build.gradle)
在文件中引入greenDAO插件
dependencies {
省略...
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
}
2)配置module下的build.gradle
添加应用插件依赖
apply plugin: 'org.greenrobot.greendao' // 添加应用依赖插件
添加库文件
dependencies {compile 'org.greenrobot:greendao:3.2.2'}
初始化GreenDao配置
greendao {
schemaVersion 1
daoPackage 'com.think.greendao'
targetGenDir 'src/main/java'
generateTests true
targetGenDirTests 'src/androidTest/gen'
}
配置中可用参数作用,可以选择性的添加使用:
schemaVersion:
当前数据库的版本号,进行升级的时候可以进行配置修改.
如果修改了实体类或者数据库的模式需要进行升级.
targetGenDir:
生成数据库相关类(Dao,DaoMaster和DaoSession)的目录,
若不指定,则默认为构建目录( build / generated / source / greendao)中生成的源文件夹。
可以通过targetGenDir 'src/main/java'将生成的类放置到src/main/java路径下面
daoPackage:
生成的Dao,DaoMaster和DaoSession的包名称。 默认包名entity对象所在的包的包名称.
generateTests:
是否生成单元测试,设置为true以自动生成单元测试,默认会生成单元测试
targetGenDirTests:
//设置生成单元测存存放的位置,默认是src/androidTest/java
3)编写GreenDao所需要的实体类
1)创建实体类,使用@Entity对类进行注解
2)定义类中的字段,并且对字段进行不同方式的注解
例如创建一个Student实体类,采用如下方式进行如下定义:
@Entity(nameInDb = "student_tb",createInDb = true)
public class Student {
@Id
private Long id;
@Property(nameInDb = "NAME")
private String name;
@Transient
private int temp;
}
***常用注解
实体@Entity注解
@Entity表示这个实体类在数据库中生成对应的表,告诉GreenDao该对象为实体只有被@Entity的实体类才能被dao类操作
@Entity(
// 如果有一个以上的模式,可以告诉greendao实体属于哪个模式(选择任何字符串作为名称)。
//3.0之前需要通过新建GreenDaoGenerator工程生成Java数据对象和DAO对象,非常的繁琐,当中可指定schema
//3.2版本采用注解生成Java数据对象和DAO对象,都是默认schema="default",改成其他会报错
schema = "default",
// 标志允许实体类可有更新,删除,刷新方法
active = true,
//指定数据库中表的名称,默认情况下,该表的名称是实体类名。
nameInDb = "teacher_tb",
//定义索引,在这里定义多个列的索引,可以跨越多个列
indexes = {
@Index(value = "name DESC", unique = true)
},
// true表示greenDAO创建数据库表(默认为true),如果不用greenDAO创建表,将此设置为false。
createInDb = true,
// 是否应该生成所有的属性构造函数。无参构造函数总是要生成的
generateConstructors = true,
// 是否生成属性的getter和setter
generateGettersSetters = true)
基础属性注解:
@Id
表示该字段是id,注意该字段的数据类型为Long,(autoincrement = true)表示主键会自增
@Property
则表示该属性将作为表的一个字段,其中nameInDb属性值是在数据库中对应的字段名称,可以自定义字段名,例如可以定一个跟实体对象字段不一样的字段名
@Transient
汉语意思:短暂的,临时的!该注解表示这个属性将不会作为数据表中的一个字段,也就是意味着不存储在数据库中
@NotNull
表示该字段不可以为空
@Generated
由greendao产生的构造函数或方法,构造函数、方法等不能被修改
索引注解:
@Unique
汉语意思:唯一的,独一无二的.使用该注解表示该字段唯一!
关系注解:
@ToOne 一对一,定义与另一个实体(一个实体对象)的关系
joinProperty,表中相关实体的属性名称
比如每个用户都有一个对应Picture属性,需要一个pictureId代表这个Picture属性,
通过@ToOne(joinProperty = "XXXX")指定pictureId,
在数据表中则会有pictureId这一列作为外键,与Picture数据表建立联系,
如果你没有指定pictureId,
greenDAO也会在数据表中生成一列属性其作用与指定的pictureId相同,
而实体类中则可以使用User的Picture属性,代码如下:
@Entity
public class Teacher {
@Id
private Long id;
private String name;
private Long pictureId;
@ToOne(joinProperty = "pictureId")
private Picture picture;
....
}
@ToMany 一对多,定义与多个实体对象的关系
referencedJoinProperty
//JoinProperty将源表列索引->目标列
一对多的关系,定义了一个实体对象对应着多个实体对象,比如一个老师对应多个Student,
在建立数据表示会在目标实体(即一对多的那个多的实体类)的数据表中建立外键,
指向源实体类(一对多中的一那个实体类)的数据表。
目标数据表中的外键属性由
@ToMany(referencedJoinProperty = "XXXX")指定。
@Entity
public class Teacher {
@Id
private Long id;
private String name;
private Long pictureId;
@ToOne(joinProperty = "pictureId")
private Picture picture;
@ToMany(referencedJoinProperty = "ownerId")
private List<Car> cars;
...
}
@Entity
public class Car {
@Id(autoincrement = true)
private Long id;
@Property(nameInDb = "ownerId")
private Long ownerId;
@NotNull
@Property(nameInDb = "carname")
private String carName;
}
其他:
@Keep
注解的代码段在GreenDao下次运行时保持不变
注解实体类:默认禁止修改此类
注解其他代码段,默认禁止修改注解的代码段
4)编译项目工程!
编辑操作Build-->MakeProject-->进行编译重新构建工程
或者使用as快捷键Ctrl+F9-->进行编译重新构建工程
重新编译构建之后:
1)Student实体类会自动生成get,set方法以及无参数构造方法和有参数的构造方法.
2)在工程目录\app\build\generated\source\greendao\com\think\greendao
生成三个类StudentDao,DaoMaster,DaoSession
5,GreenDao对外提供核心类简介
各个类之间的运用示意图:
DaoMaster-->DaoSession-->XXXDao-->XXXEntity-->
1,DaoMaster
使用GreenDao的切入点,GreenDao的顶级对象,作为数据库对象,用于创建表和删除表
DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的Dao类
方法介绍:
构造方法
DaoMaster(Database db)
DaoMaster(SQLiteDatabase db)
创建表
static void createAllTables(Database db, boolean ifNotExists)
删除表
static void dropAllTables(Database db, boolean ifExists)
获取DaoSession
static DaoSession newDevSession(Context context, String name)
DaoSession newSession()
DaoMaster.OpenHelper
直接或者间接继承自SQLiteOpenHelper
DaoMaster.DevOpenHelper
直接或者间接继承自SQLiteOpenHelper
内部类OpenHelper和DevOpenHelper是创建SQLite数据库的SQLiteOpenHelper的具体实现
2,DaoSession
管理所有可用xxDao对象,
使用其中一个get方法获取,
DaoSession还为实体提供了一些通用的持久性方法,如插入,加载,更新,刷新和删除。
更多介绍可以参看相关文档:
http://greenrobot.org/greendao/documentation/sessions/ 3,Dao层,AbstractDao
Dao对象中存在着增删改查等API
数据访问对象(Dao)持续存在并查询实体,对于每个实体,GreenDao生成一个Dao,它比DaoSession有更多的持久化方法,
例如:count,loadAll等等!
部分核心方法介绍:
增加单个数据,返回实体id
long insert(T entity)
long insertOrReplace(T entity)
增加多个数据
insertInTx(Iterable<T> entities)
insertOrReplaceInTx(Iterable<T> entities)
删除数据
delete(T entity)
deleteAll()
deleteByKey(K key)
delete(T entity)
删除多个数据
deleteInTx(Iterable<T> entities)
修改单个数据
update(T entity)
修改多个数据
updateInTx(Iterable<T> entities)
查询单个数据
T load(K key)
查询全部
List<T> loadAll()
数据条数
long count()
获取查找构造器
QueryBuilder<T> queryBuilder()
.queryBuilder().list();
QueryBuilder,查找构造器以及其主要方法
查询附加单个条件
.where()
.whereOr()
查询附加多个条件
.where(, , ,)
.whereOr(, , ,)
查询附加排序,降序,升序
.orderDesc()
.orderAsc()
查询限制当页个数
.limit()
返回单个结果,如果没有满足条件的结果,前者返回null, 后者抛出异常
unique()
uniqueOrThrow()
返回总条数
long count()
4,实体
java对象 通常实体是使用标准Java属性(JavaBean)来表示数据库行的对象
6,StudentDao的使用
1,创建DaoMaster.DevOpenHelper对象.
2,通过DaoMaster.DevOpenHelper的实例获取SQLiteOpenHelper并建立数据连接
3,通过构造函数DaoMaster(SQLiteDatabase db)来创建DaoMaster实例对象
4,通过DaoMaster实例对象获取DaoSession对象
5,通过DaoSession对象来获取StudentDao对象
6,使用StudentDao对象来进行增删改查!!
7,数据库的升级
01一般的数据库升级:
1)在module下的build.gradle文件中修改版本号:
例如当前版本schemaVersion 1,升级就要修改成schemaVersion 2
2)修改实体类
对定义的实体类添加或者删除字段
3)重现编译项目运行
4)使用 DevOpenHelper 每次升级数据库,表会删除重建,推荐开发使用
02特殊情况可能需要自己编写数据库迁移脚本,
这种时候可以通过继承DaoMaster.OpenHelper创建自定义的更新数据库类
public class MyDBHelper extends DaoMaster.OpenHelper {
public MyDBHelper(Context context, String name) {
super(context, name);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onUpgrade(db, oldVersion, newVersion);
//在onUpgrade方法中进行数据库的迁移
}
}
注意:如果采用自定义的方式,则数据库的出书画需要采用如下的方式
1),当新建一个表就是新建一个bean实体类,
然后重新编译构建,重新生成dao等相关的类,
2)更改app下build.gradle的数据库的版本号
//初始化greendao基本信息
greendao{
schemaVersion 4
daoPackage 'xxx'
targetGenDir 'src/main/java'
}
3)调用让其更新
原理:
首先创建临时表(数据格式和原表一模一样)。
把当前表的数据插入到临时表中去。
删除掉原表,创建新表。
把临时表数据插入到新表中去,然后删除临时表。