greenDAO是一款为Android而生的ORM工具。通过greenDAO你可以减少许多重复性代码,并通过简单的接口操作数据库。
在本节中,我们将先带大家体验greenDAO的使用,在感受到greenDAO的强大之处后,再对greenDAO的配置进行介绍
使用greenDAO
假定你已经集成并配置好了greenDAO,现在你想要对一个数据进行增删查改操作,那么你仅需要以下几个步骤:
一、编写entity
实体是一个用于持久化数据到数据库中的类,实体的数据结构与数据库列的属性相对应。
Copy @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对象。
Copy // get the note DAO
DaoSession daoSession = ((App) getApplication()).getDaoSession();
noteDao = daoSession.getNoteDao();
通过DAO对象你便可以对数据库进行增删查改操作了。
插入数据
Copy 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());
删除数据
Copy noteDao.deleteByKey(id);
查找数据
Copy // 查询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();
更改数据
Copy note.setText("This note has changed.");
noteDao.update(note);
有没有感觉很简单?这便是greenDAO的强大之处。接下去让我们来了解如何集成并配置greenDAO吧!
配置greenDAO
添加依赖
为了使用greenDAO ,请将以下Gradle配置添加到您的Android项目中。
在 root build.gradle
文件:
Copy 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
文件:
Copy 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:
Copy // 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,并整个应用当却仅当执行一次。
Copy // 提示: 当schema改变时,DevOpenHelper将删除所有表,因此,请仅在dev时使用DevOpenHelper, 正式环境请使用OpenHelperd的子类代替
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db");
Database db = helper.getWritableDb();
daoSession = new DaoMaster(db).newSession();
实战方案
初始化Dao
Copy 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运行一下就可以重新生成表了,另外修改表中字段都需要重新初始化数据库才会生效。
Copy greendao {
schemaVersion 2
//daoPackage 'com.anye.greendao.gen'
//targetGenDir 'src/main/java'
}
参考文档
greenDAO官方文档
greenDAO Github