数据库开源框架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)调用让其更新
原理:
首先创建临时表(数据格式和原表一模一样)。
把当前表的数据插入到临时表中去。
删除掉原表,创建新表。
把临时表数据插入到新表中去,然后删除临时表。
推荐博客:
http://blog.csdn.net/xuwb123xuwb/article/details/73509107
推荐demo:
http://download.csdn.net/detail/bskfnvjtlyzmv867/9835023
更多对于GreenDao的数据库操作还需要多多从实战中去探索!

数据库开源框架GreenDao的使用解析的更多相关文章

  1. 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析

    通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...

  2. 数据库开源框架之GreenDAO

    主页: https://github.com/greenrobot/greenDAO 配置: 添加以下依赖 * compile 'de.greenrobot:greendao:2.1.0' * com ...

  3. 开源框架GreenDao的操作

    1.为什么需要GreenDao?Google原生API不方便 @1手动组拼SQL语句 @2需要自己写操作数据库代码 @3不能把数据库中的数据映射成对象 @4没有实现关联查询 2.GreenDao是什么 ...

  4. 【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结

    转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁 ...

  5. 数据库ORM框架GreenDao

    常用的数据库: 1). Sql Server2). Access3). Oracle4). Sysbase5). MySql6). Informix7). FoxPro8). PostgreSQL9) ...

  6. Android eclipse下数据开源框架GreenDao的配置

    1.前言 ORM(Object-RelationMapping,对象关系映射),是一种为了解决面向对象与数据库存在的互一匹配的现象的技术,通过描述对象和关系数据库之间的映射,将程序中的对象自动持久化到 ...

  7. Android 数据库ORM框架GreenDao学习心得及使用总结<一>

    转: http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读 ...

  8. Android 轻量级ORM数据库开源框架ActiveAndroid 源码分析

    ActiveAndroid 项目地址在https://github.com/pardom/ActiveAndroid 关于他的详细介绍和使用步骤 可以看下面两篇文章: https://github.c ...

  9. Android 数据库ORM框架GreenDao学习心得及使用总结<二>

    转:http://blog.csdn.net/xushuaic/article/details/24496191 第五篇 查询 查询会返回符合某些特定标准的实体.你可以使用原始的SQL定制查询语句,或 ...

随机推荐

  1. Javascript百学不厌 - 模块模式

    记录自己觉得重要又可能忘记的东西 用模块模式产生安全的对象: var serial_maker = function () { var preifx = ''; var seq = 0; return ...

  2. kubernetes集群搭建(9):docker 镜像的导入与导出

    由于K8s搭建时官方提供的镜像不FQ是访问不了的,所以搭建过程中很多时间都耗费在去找镜像去了 下面是我搭建k8s集群用到的镜像  没有采用之前我用的二进制文件搭建(dns没成功),这里采用的Kubea ...

  3. Liferay7 BPM门户开发之20: 理解Asset Framework

    Asset框架用于将您开发的门户内容添加Liferay的核心系统功能.打个比方,你开发了一个事件TodoList管理的插件,在列表显示的时候,你可以集成Asset框架,让你的自定义内容支持Tag标签. ...

  4. logstash grok 内置正则

    参考地址:https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns USERNAME [a-zA-Z0-9._-]+ ...

  5. 解决vue路由history模式刷新后404的问题

    server { listen ;#默认端口是80,如果端口没被占用可以不用修改 server_name localhost; root E:/vue/my_project/dist;#vue项目的打 ...

  6. Hive ROW_NUMBER,RANK(),DENSE_RANK()

    准备数据 浙江,杭州,300 浙江,宁波,150 浙江,温州,200 浙江,嘉兴,100 江苏,南京,270 江苏,苏州,299 江苏,某市,200 江苏,某某市,100   创建表 CREATE t ...

  7. java 面试基础总结(二)---多线程

    1.实现多线程的三种方法 1.继成Thread 类,覆盖run()方法即可 2.implements Runnable接口 3.implements Callale接口,执行时通过FutureTask ...

  8. 【详解】Spring Security 之 SecurityContext

    前言 本文主要整理一下SecurityContext的存储方式. SecurityContext接口 顾名思义,安全上下文.即存储认证授权的相关信息,实际上就是存储"当前用户"账号 ...

  9. Angular2入门:TypeScript的函数 - 函数定义、可选参数、默认参数和函数重载

  10. 使用Asp.Net Core MVC 开发项目实践[第二篇:EF Core]

    在项目中使用EF Core还是比较容易的,在这里我们使用的版本是EF Core 2.2. 1.使用nuget获取EF Core包 这个示例项目使用的是SQLSERVER,所以还需要下载Microsof ...