Gradle配置
首先在根目录
下的build.gradle下添加以下内容:
1 | // In your root build.gradle file: |
第5行我没有添加项目也可以正常运行,应该是jcenter()
里已经包含了相关包了吧。
第9行比较重要,greenDAO是根据你定义的Entity由这个插件为你自动创建对应的数据库表文件的。
然后在app目录
下build.gradle下添加一下greenDAO仓库,当然别忘了第3行的插件apply。
1 | // In your app projects build.gradle file: |
到这儿,greenDAO所需要的环境就全配置完了,接下来让我来创建数据库吧!
创建数据库
Entity对象
我们先创建一个Student对象吧。
1 | public class Student { |
在greenDAO的世界里,我们只需要创建Entity对象,greenDAO会自动帮我们创建对应的数据库表结构。在上面的代码里,我们创建了一个Student对象,有name和age两个属性,至于id这个字段,则代表了每一个Student对象在数据库表里的唯一id,默认情况下,id就是我们的主键,具有唯一性,并且默认自增。
好了,现在我们Student类有了,如何映射到数据库文件呢?
映射到数据库表
greenDAO使用注解来创建Entity对象与数据库表结构的对应关系。
@Entity:只有被@Entity注解的类才会被映射成数据库表文件。
@Id:对应表的主键,long/Long类型,默认自增。
现在我们为Student对象添加注解:
1 |
|
然后我们重新Sync一下Project,神奇的事情发生了,Student类里面自动生成了一些代码:
1 |
|
就这样吗?当然不止如此,一同创建好了的还有操作Student表所需的所有相关类,默认存储在/app/build/generated/source/greendao/<package-name>
路径下:
这里我们先不讲这里面的具体代码,先来看看数据库的增删查改(CRUD)的基本api使用吧。
创建数据库
在正式进入CRUD之前还有一个小步骤——创建数据库。一般我们在操作数据库时都是先建数据库,如数据库名字,使用什么引擎,指定Unicode类型等等,然后才是建表。但是在greenDAO的使用过程中,我发现是没法先创建数据库的。可能在greenDAO看来,只有你明确建立了一组对象与表的映射关系,greenDAO才会去创建一个数据库,并创建对应的表吧。Anyway,我们刚创建了一个Student对象(表),接下来我们需要指定我们的数据库名字。由于对数据库的操作可能持续在App的整个运行期间,我们将数据库的初始化操作放在Application里。继承Application类,加入以下代码:
1 | public class MyApplication extends Application { |
DaoSession
是我们操作DAO类的重要对象,主要负责提供具体的DAO类对象,在上例中,我们需要操作Student对象,需要对应的StudentDAO类提供对数据库的所有操作入口,而StudentDAO对象则由DaoSession提供。在App任意地方,当我们需要使用StudentDAO对象时,可引用以下代码:
1 | MyApplication app = (MyApplication) getApplication(); |
至此,我们创建了Student的实体类,greenDAO帮我们创建了对象的数据库表,并提供了一个StudentDAO类供我们进行所有的CRUD操作。
数据库操作(CRUD)
添加
首先创建一个Student对象,
1 | Student student = new Student(); |
Note:我们不需要设置id,该字段由数据库添加成功之后返回。
1 | long id = dao.insert(student); // 插入到数据库当中,成功后返回主键id |
删除
这里我们只看两个简单的API:
1 | public void delete(T entity) {} // 此处T对应Student |
示例代码:
1 | if (adapter.getItemCount() > 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 | eq(Object value) // 相当于SQL语句里的"=",等于 |
查询的结果按名字升序排序:
1 | List<Student> students = queryBuilder.orderAsc(StudentDao.Properties.Name).list(); |
更新
更新操作需要先获取到Student对象,更改信息后update:
1 | Student student = adapter.getStudents().get(0); |
以上就是CRUD的简单操作了,进阶使用后续更新。
扩展工具
在结束本篇内容之前,我想介绍两个小工具,帮助大家在应用开发期间能更方便的调试我们的数据库。
Stetho
Stetho是由Facebook提供的调试Android应用的工具。它主要有两个强大的功能,其一是获取我们的网络请求,将所有请求和响应信息显示给我们,有了它我们再也不需要每次打印一堆的Log信息了;其二便是快速访问我们的数据库。如果我们使用的是Android自带的SQLite数据库,它默认的存储路径是/data/data/<package-name>
。如果我们需要可视化的浏览数据库,必须将db文件导出,再导出到第三方的可视化工具上方可查看。有了Stetho,我们就不需要再经历这么繁琐的步骤了。
配置Stetho只需要添加以下依赖包:
1 | dependencies { |
然后在Application里进行初始化操作:
1 |
|
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