数据库操作

greenDAO是一款为Android而生的ORM工具。通过greenDAO你可以减少许多重复性代码,并通过简单的接口操作数据库。

在本节中,我们将先带大家体验greenDAO的使用,在感受到greenDAO的强大之处后,再对greenDAO的配置进行介绍

使用greenDAO

假定你已经集成并配置好了greenDAO,现在你想要对一个数据进行增删查改操作,那么你仅需要以下几个步骤:

一、编写entity

实体是一个用于持久化数据到数据库中的类,实体的数据结构与数据库列的属性相对应。

@Entity(indexes = {
    @Index(value = "text, date DESC", unique = true)
})
public class Note {

    @Id
    private Long id;

    @NotNull
    private String text;
    private Date date;
    ...

二、生成DAO

DAO帮助我们向数据库添加数据。DAO类无需你手动编写,通过在Android Studio中使用Build > Make project既可触发greenDAO生成DAO类

三、操作数据

在对数据进行操作之前,你需要获取待操作数据的DAO对象。如示例中,待操作Note数据,故获取NoteDao对象。

// get the note DAO
DaoSession daoSession = ((App) getApplication()).getDaoSession();
noteDao = daoSession.getNoteDao();

通过DAO对象你便可以对数据库进行增删查改操作了。

插入数据

Note note = new Note();
note.setText(noteText);
note.setComment(comment);
note.setDate(new Date());
note.setType(NoteType.TEXT);
noteDao.insert(note);
Log.d("DaoExample", "Inserted new note, ID: " + note.getId());

删除数据

noteDao.deleteByKey(id);

查找数据

// 查询ID为“1”的用户:
User joes = userDao.queryBuilder()
  .where(Properties.Id.eq("1"))
  .unique();

// 查询所有名字为“Joe”的用户,按姓氏排序:
List<User> joes = userDao.queryBuilder()
  .where(Properties.FirstName.eq("Joe"))
  .orderAsc(Properties.LastName)
  .list();

// 获取名字为“Joe”且出生日期为1970年10月或之后的用户。
QueryBuilder<User> qb = userDao.queryBuilder();
qb.where(Properties.FirstName.eq("Joe"),
qb.or(Properties.YearOfBirth.gt(1970),
qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));
List<User> youngJoes = qb.list();

更改数据

note.setText("This note has changed.");
noteDao.update(note);

有没有感觉很简单?这便是greenDAO的强大之处。接下去让我们来了解如何集成并配置greenDAO吧!

配置greenDAO

添加依赖

为了使用greenDAO ,请将以下Gradle配置添加到您的Android项目中。

在 root build.gradle 文件:

buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // add plugin
    }
}

在app module app/build.gradle文件:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin

dependencies {
    implementation 'org.greenrobot:greendao:3.3.0' // add library
}

添加配置

您无需任何配置即可开始使用greenDAO Gradle插件。不过,我们建议您至少配置一下schema version:

// In the build.gradle file of your app project:
android {
...
}

greendao {
    schemaVersion 2
    // daoPackage "com.example.model" // set package of generated classes
}

greendao的各配置项说明如下:

  • schemaVersion:数据库schema的当前版本。*OpenHelpers类中将使用到该值。如果您对entity或者数据库schema进行了变更,则必须增加该值。默认值为1。

  • daoPackage:一个包名,用于存放生成的DAO,DaoMaster和DaoSession。若未设置,将使用source entities的包名。

  • targetGenDir:生成sources的存储位置。默认为构建目录(build/generated/source/greendao

  • generateTests:设置为true时,将自动生成单元测试。

  • targetGenDirTests:生成单元测试的存储位置。默认为src/androidTest/java

初始化greenDAO和数据库

在Application类中初始化一个DaoSession,并整个应用当却仅当执行一次。

// 提示: 当schema改变时,DevOpenHelper将删除所有表,因此,请仅在dev时使用DevOpenHelper, 正式环境请使用OpenHelperd的子类代替
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db");
Database db = helper.getWritableDb();
daoSession = new DaoMaster(db).newSession();

实战方案

  1. 初始化Dao

        private void initDao() {
            DaoMaster daoMaster = new DaoMaster(DBManager.getInstance(mContext).getWritableDatabase());
            DaoSession daoSession = daoMaster.newSession();
            weiBoContactDao = daoSession.getWeiBoContactDao();
        }

常见问题

使用greenDao时,出现 no such table的异常

no such table:中文译”没有找到表“,其原因是之前的表已经建好了,而新增的表需要重新初始化数据库才可以建好,所以只需要把schemaVersion 改变一下版本号,重新sync运行一下就可以重新生成表了,另外修改表中字段都需要重新初始化数据库才会生效。

   greendao {
       schemaVersion 2
       //daoPackage 'com.anye.greendao.gen'
       //targetGenDir 'src/main/java'
   }

参考文档

greenDAO官方文档

greenDAO Github

Last updated

Was this helpful?