Android 之 GreenDao 数据库详解
GreenDao 介绍
GreenDao 是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库(SQLite),它能够让你操作数据库时更简单、更方便。下面是映射关系图:
官网地址:http://greenrobot.org/greendao/
Github:https://github.com/greenrobot/greenDAO
GreenDao 优点
- 性能最大化,号称 Android 最快的关系型数据库
- 最小化内存开销
- 库文件比较小,小于 100K,编译时间低,而且可以避免 65K 方法限制
- 支持数据库加密(可以配合 SQLCipher 进行数据库加密)
- 简洁易用的 API,操作实体灵活:支持 get,update,delete 等操作
GreenDao 使用
GreenDao 3.0 开始使用注解的方式定义实体类(entity),并且是通过安装 gradle 插件来生成代码。
1、配置 Gradle
配置工程目录的build.gradle
文件,这里也是 GreenDao 的核心。
buildscript {
repositories {
jcenter()
mavenCentral() // 添加远程仓储
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.2'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // 添加 GreenDao 插件
}
}
allprojects {
repositories {
jcenter()
}
}
配置项目中的build.gradle
文件
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // 添加项目依赖
android {
...
}
dependencies {
...
compile 'org.greenrobot:greendao:3.2.2' // 添加插件引用
}
配置 GreenDao 的相关属性,当然这里也可以不配置。
greendao {
// 指定数据库 schema 版本号,迁移等操作会用到
schemaVersion 1
// DaoSession、DaoMaster 以及所有实体类的 dao 生成的目录,默认为你的 entity 所在的包名(build/generated/source/greendao)
// daoPackage 包名
daoPackage 'mtf.com.greendaodemo.green'
// 这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的 java 目录中,而不是 build 中,这样就不用额外的设置资源目录了
targetGenDir 'src/main/java'
// 设置为 true,自动生成单元测试。
generateTests: true
// 在哪里产生的单元测试应该被存储在基本目录。默认为 SRC / androidTest / java 的。
targetGenDirTests:
}
2、GreenDao 注解
实体
@Entity
注解- schema:告知 GreenDao 当前实体属于哪个 schema。
- active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法。
- nameInDb:在数据中使用的别名,默认使用的是实体的类名。
- indexes:定义索引,可以跨越多个列。
- createInDb:标记创建数据库表。
基础属性注解
@Id
:主键 Long 型,默认自增,可以通过 @Id(autoincrement = true) 设置自增长。@Property
:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb=”name”)。@NotNul
:设置数据库表当前列不能为空。@Transient
:表明这个字段不会被写入数据库,只是作为一个普通的 java 类字段,用来临时存储数据的,不会被持久化。
索引注解
@Index
:使用@Index
作为一个属性来创建一个索引,通过 name 设置索引别名,也可以通过 unique 给索引添加约束。@Unique
:向数据库列添加了一个唯一的约束。
关系注解
@ToOne
:定义与另一个实体(一个实体对象)的关系。@ToMany
:定义与多个实体对象的关系。
3、使用注解创建实体类
@Entity
public class User {
@Id
private Long id; // 这里是 Long 类型而不是 long
private String userName;
private int age;
private String sex;
}
写到这里试着编译项目吧,build 后 GreenDao 插件会为所有带有该注解的实体生成 Dao 文件,以及 DaoManager 与 DaoSession,默认生成目录为build/generated/source
,如果我们在 gradle 脚本中配置了,则会生成在我们的配置目录。
查看一下自己的项目目录,你会发现已经多出了以下几个文件:
解释一下多出的这三个文件:
DaoMaster:使用 greenDAO 的切入点。DaoMaster 保存数据库对象(SQLiteDatabase)并管理特定模式的 DAO 类(而不是对象)。它有静态方法来创建表或删除它们。它的内部类 OpenHelper 和 DevOpenHelper 是 SQLiteOpenHelper 实现,在 SQLite 数据库中创建模式。
DaoSession:管理特定模式的所有可用 DAO 对象,您可以使用其中一个 getter 方法获取。DaoSession 还为实体提供了一些通用的持久性方法,如插入,加载,更新,刷新和删除。最后,DaoSession 对象也跟踪标识范围。
DAO:数据访问对象(DAO)持续并查询实体。对于每个实体,greenDAO 生成 DAO。它具有比 DaoSession 更多的持久化方法,例如:count,loadAll 和 insertInTx。
刚刚创建的实体类也会多出一些东西,get 和 set 这些方法已经帮助我们自动生成,下面就是我们编译之后的实体类:
// @Entity 将我们的 java 普通类变为一个能够被 greenDAO 识别的数据库类型的实体类
@Entity
public class User {
@Id
private Long id; // 这里是 Long 类型而不是 long
private String userName;
private int age;
private String sex;
@Generated(hash = 1887126858)
public User(Long id, String userName, int age, String sex) {
this.id = id;
this.userName = userName;
this.age = age;
this.sex = sex;
}
@Generated(hash = 586692638)
public User() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return this.sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
4、初始化数据库,进行增删改查等操作。
public class MyApplication extends Application {
public static MyApplication instances;
private static DaoMaster.DevOpenHelper devOpenHelper;
private static SQLiteDatabase database;
private static DaoMaster daoMaster;
private static DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
instances = this;
initDatabase();
}
public static MyApplication getInstances() {
return instances;
}
/**
* 初始化 greenDao 数据库,这里使用单例模式构建一个工具类来获取 daoSession 等对象
*/
public static void initDatabase() {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
devOpenHelper = new DaoMaster.DevOpenHelper(getInstances(), "test-db", null);//数据库名
database = devOpenHelper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
daoMaster = new DaoMaster(database);
daoSession = daoMaster.newSession();
}
public static DaoSession getDaoSession() {
return daoSession;
}
public static SQLiteDatabase getDb() {
return database;
}
}
(完)