greenDAO(一):配置与简单使用

Gradle配置

首先在根目录下的build.gradle下添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
// In your root build.gradle file:
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
}

第5行我没有添加项目也可以正常运行,应该是jcenter()里已经包含了相关包了吧。
第9行比较重要,greenDAO是根据你定义的Entity由这个插件为你自动创建对应的数据库表文件的。

然后在app目录下build.gradle下添加一下greenDAO仓库,当然别忘了第3行的插件apply。

1
2
3
4
5
6
7
// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin

dependencies {
compile 'org.greenrobot:greendao:3.2.2' // add library
}

到这儿,greenDAO所需要的环境就全配置完了,接下来让我来创建数据库吧!

创建数据库

Entity对象

我们先创建一个Student对象吧。

1
2
3
4
5
public class Student {
private Long id;
private String name;
private int age;
}

在greenDAO的世界里,我们只需要创建Entity对象,greenDAO会自动帮我们创建对应的数据库表结构。在上面的代码里,我们创建了一个Student对象,有name和age两个属性,至于id这个字段,则代表了每一个Student对象在数据库表里的唯一id,默认情况下,id就是我们的主键,具有唯一性,并且默认自增。

好了,现在我们Student类有了,如何映射到数据库文件呢?

映射到数据库表

greenDAO使用注解来创建Entity对象与数据库表结构的对应关系。

@Entity:只有被@Entity注解的类才会被映射成数据库表文件。

@Id:对应表的主键,long/Long类型,默认自增。

现在我们为Student对象添加注解:

1
2
3
4
5
6
7
@Entity
public class Student {
@Id
private Long id;
private String name;
private int age;
}

然后我们重新Sync一下Project,神奇的事情发生了,Student类里面自动生成了一些代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Entity
public class Student {
@Id
private Long id;
private String name;
private int age;

@Generated(hash = 352757281)
public Student(Long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}

@Generated(hash = 1556870573)
public Student() {
}

// 默默忽略Setters和Getters
}

就这样吗?当然不止如此,一同创建好了的还有操作Student表所需的所有相关类,默认存储在/app/build/generated/source/greendao/<package-name>路径下:

这里我们先不讲这里面的具体代码,先来看看数据库的增删查改(CRUD)的基本api使用吧。

创建数据库

在正式进入CRUD之前还有一个小步骤——创建数据库。一般我们在操作数据库时都是先建数据库,如数据库名字,使用什么引擎,指定Unicode类型等等,然后才是建表。但是在greenDAO的使用过程中,我发现是没法先创建数据库的。可能在greenDAO看来,只有你明确建立了一组对象与表的映射关系,greenDAO才会去创建一个数据库,并创建对应的表吧。Anyway,我们刚创建了一个Student对象(表),接下来我们需要指定我们的数据库名字。由于对数据库的操作可能持续在App的整个运行期间,我们将数据库的初始化操作放在Application里。继承Application类,加入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MyApplication extends Application {
private static final String DB_NAME = "db";
private DaoSession daoSession;

@Override
public void onCreate() {
super.onCreate();

DevOpenHelper helper = new DevOpenHelper(this, DB_NAME);
Database db = helper.getWritableDb();
daoSession = new DaoMaster(db).newSession();
}

public DaoSession getDaoSession() {
return daoSession;
}
}

DaoSession是我们操作DAO类的重要对象,主要负责提供具体的DAO类对象,在上例中,我们需要操作Student对象,需要对应的StudentDAO类提供对数据库的所有操作入口,而StudentDAO对象则由DaoSession提供。在App任意地方,当我们需要使用StudentDAO对象时,可引用以下代码:

1
2
MyApplication app = (MyApplication) getApplication();
StudentDao studentDao = app.getDaoSession().getStudentDao();

至此,我们创建了Student的实体类,greenDAO帮我们创建了对象的数据库表,并提供了一个StudentDAO类供我们进行所有的CRUD操作。

数据库操作(CRUD)

添加

首先创建一个Student对象,

1
2
3
4
Student student = new Student();
Random random = new Random();
student.setName("I am " + random.nextInt(100));
student.setAge(random.nextInt(100));

Note:我们不需要设置id,该字段由数据库添加成功之后返回。

1
2
long id = dao.insert(student); // 插入到数据库当中,成功后返回主键id
student.setId(id);

删除

这里我们只看两个简单的API:

1
2
public void delete(T entity) {} // 此处T对应Student
public void deleteByKey(K key) {} // 此处K对应Long

示例代码:

1
2
3
4
5
6
7
if (adapter.getItemCount() > 0) {
Student student = adapter.getStudents().get(0);
dao.delete(student);
// or dao.delete(student.getId());
adapter.getStudents().remove(0);
adapter.notifyItemRemoved(0);
}

查询

查询涉及到一个新类QueryBuilder,来看看官方说明:

The QueryBuilder class lets you build custom queries for your entities without SQL and helps detect errors already at compile time.

翻译过来就是,QueryBuilder可以帮你在不用SQL语句的情况下从数据库查询数据,并且可以在编译阶段就检测到所有异常。

来看看如何使用吧。首先获取QueryBuilder对象:

1
QueryBuilder<Student> queryBuilder = dao.queryBuilder();

如果查询Student表里的所有数据,直接调用:

1
List<Student> students = queryBuilder.list();

查询条件为年龄大于等于30岁:

1
List<Student> students = queryBuilder.where(StudentDao.Properties.Age.ge(30)).list();

查询不同的条件时,针对哪个字段查询,就调用对应字段的Property(org.greenrobot.greendao.Property)对象,这些对象在创建数据库时greenDAO为我们都创建好了,我们只需要传入我们的查找条件,API具体可以查看Property类,这里仅列举一些:

1
2
3
4
5
eq(Object value) // 相当于SQL语句里的"=",等于
notEq(Object value) // 相当于SQL语句里的"<>",不等于
gt(Object value) // ">"
ge(Object value) // ">="
like(String value) // 关键字查询

查询的结果按名字升序排序:

1
List<Student> students = queryBuilder.orderAsc(StudentDao.Properties.Name).list();

更新

更新操作需要先获取到Student对象,更改信息后update:

1
2
3
Student student = adapter.getStudents().get(0);
student.setAge(40);
dao.update(student);

以上就是CRUD的简单操作了,进阶使用后续更新。

扩展工具

在结束本篇内容之前,我想介绍两个小工具,帮助大家在应用开发期间能更方便的调试我们的数据库。

Stetho

Stetho是由Facebook提供的调试Android应用的工具。它主要有两个强大的功能,其一是获取我们的网络请求,将所有请求和响应信息显示给我们,有了它我们再也不需要每次打印一堆的Log信息了;其二便是快速访问我们的数据库。如果我们使用的是Android自带的SQLite数据库,它默认的存储路径是/data/data/<package-name>。如果我们需要可视化的浏览数据库,必须将db文件导出,再导出到第三方的可视化工具上方可查看。有了Stetho,我们就不需要再经历这么繁琐的步骤了。

配置Stetho只需要添加以下依赖包:

1
2
3
dependencies { 
compile 'com.facebook.stetho:stetho:1.5.0'
}

然后在Application里进行初始化操作:

1
2
3
4
5
@Override
public void onCreate() {
super.onCreate();
Stetho.initializeWithDefaults(this);
}

Stetho不是单独工作的,它其实只是做到了拦截与获取所有信息,信息展示的部分还要用到我们的第二个工具。

Chrome DevTools

看名字就知道了,Google出品,品质保证。

使用Chrome DevTools我们需要打开我们的Chrome浏览器,在地址栏里输入chrome://inspect,如果前面的步骤都正确执行了的话,这时候打开我们的应用,我们在Chrome里应该能看到图2的界面:

然后我们点击最底下的inspect,就会进入到该应用的主控制界面,如图3所示:

我们切换到Resources选项,然后在左侧打开Web SQL,Db_Info就是我们一开始定义的数据库的名字,STUDENT是表的名字,每当我们进行了增删查改的操作之后,点击左侧下方的更新按钮,就能实时看到我们对数据库的操作有没有成功了。

如果点击inspect之后显示空白界面,请连接一下VPN之后再重试一下,第一次加载,组件被墙所以加载不出来,以后再使用就不需要VPN的支持了。

Chrome DevTools的调试功能远不止如此,今天介绍数据库就介绍它的部分功能,大家可以自行深入探索一下哦!

最后附上效果图:


参考与链接:

示例代码在我的GitHub仓库里,分支是lesson1

0%