Android 之 GreenDao 数据库详解

GreenDao 介绍


GreenDao 是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库(SQLite),它能够让你操作数据库时更简单、更方便。下面是映射关系图:

GreenDao

官网地址: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 的核心。

  1. buildscript {
  2. repositories {
  3. jcenter()
  4. mavenCentral() // 添加远程仓储
  5. }
  6. dependencies {
  7. classpath 'com.android.tools.build:gradle:2.3.2'
  8. classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // 添加 GreenDao 插件
  9. }
  10. }
  11. allprojects {
  12. repositories {
  13. jcenter()
  14. }
  15. }

配置项目中的build.gradle文件

  1. apply plugin: 'com.android.application'
  2. apply plugin: 'org.greenrobot.greendao' // 添加项目依赖
  3. android {
  4. ...
  5. }
  6. dependencies {
  7. ...
  8. compile 'org.greenrobot:greendao:3.2.2' // 添加插件引用
  9. }

配置 GreenDao 的相关属性,当然这里也可以不配置。

  1. greendao {
  2. // 指定数据库 schema 版本号,迁移等操作会用到
  3. schemaVersion 1
  4. // DaoSessionDaoMaster 以及所有实体类的 dao 生成的目录,默认为你的 entity 所在的包名(build/generated/source/greendao)
  5. // daoPackage 包名
  6. daoPackage 'mtf.com.greendaodemo.green'
  7. // 这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的 java 目录中,而不是 build 中,这样就不用额外的设置资源目录了
  8. targetGenDir 'src/main/java'
  9. // 设置为 true,自动生成单元测试。
  10. generateTests true
  11. // 在哪里产生的单元测试应该被存储在基本目录。默认为 SRC / androidTest / java 的。
  12. targetGenDirTests
  13. }

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、使用注解创建实体类

  1. @Entity
  2. public class User {
  3. @Id
  4. private Long id; // 这里是 Long 类型而不是 long
  5. private String userName;
  6. private int age;
  7. private String sex;
  8. }

写到这里试着编译项目吧,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 这些方法已经帮助我们自动生成,下面就是我们编译之后的实体类:

  1. // @Entity 将我们的 java 普通类变为一个能够被 greenDAO 识别的数据库类型的实体类
  2. @Entity
  3. public class User {
  4. @Id
  5. private Long id; // 这里是 Long 类型而不是 long
  6. private String userName;
  7. private int age;
  8. private String sex;
  9. @Generated(hash = 1887126858)
  10. public User(Long id, String userName, int age, String sex) {
  11. this.id = id;
  12. this.userName = userName;
  13. this.age = age;
  14. this.sex = sex;
  15. }
  16. @Generated(hash = 586692638)
  17. public User() {
  18. }
  19. public Long getId() {
  20. return this.id;
  21. }
  22. public void setId(Long id) {
  23. this.id = id;
  24. }
  25. public String getUserName() {
  26. return this.userName;
  27. }
  28. public void setUserName(String userName) {
  29. this.userName = userName;
  30. }
  31. public int getAge() {
  32. return this.age;
  33. }
  34. public void setAge(int age) {
  35. this.age = age;
  36. }
  37. public String getSex() {
  38. return this.sex;
  39. }
  40. public void setSex(String sex) {
  41. this.sex = sex;
  42. }
  43. }

4、初始化数据库,进行增删改查等操作。

  1. public class MyApplication extends Application {
  2. public static MyApplication instances;
  3. private static DaoMaster.DevOpenHelper devOpenHelper;
  4. private static SQLiteDatabase database;
  5. private static DaoMaster daoMaster;
  6. private static DaoSession daoSession;
  7. @Override
  8. public void onCreate() {
  9. super.onCreate();
  10. instances = this;
  11. initDatabase();
  12. }
  13. public static MyApplication getInstances() {
  14. return instances;
  15. }
  16. /**
  17. * 初始化 greenDao 数据库,这里使用单例模式构建一个工具类来获取 daoSession 等对象
  18. */
  19. public static void initDatabase() {
  20. // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
  21. // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
  22. // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
  23. // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
  24. devOpenHelper = new DaoMaster.DevOpenHelper(getInstances(), "test-db", null);//数据库名
  25. database = devOpenHelper.getWritableDatabase();
  26. // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
  27. daoMaster = new DaoMaster(database);
  28. daoSession = daoMaster.newSession();
  29. }
  30. public static DaoSession getDaoSession() {
  31. return daoSession;
  32. }
  33. public static SQLiteDatabase getDb() {
  34. return database;
  35. }
  36. }

(完)