首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

提升效率的Android数据持久层:Room

没有数据的App只是Demo。只要涉及到一些会产生数据的操作,我们都会看看是不是需要把数据保存起来。这也是数据持久层的作用。Android在这一块当然是提供了强有力的工具支持,例如内置的SQLite、SharedPreference等,还有很多优秀的第三方ORM框架。今天要介绍的,是Google自己的Android持久层框架:Room。同时也有一首好听的纯音乐《实现》。

本文索引

Android Room是什么?

通过实例上手Room

效果展示

总结

Android Room是什么?

简单的说,Room也是一个ORM框架,它在SQLite上提供了一个抽象层,屏蔽了部分底层的细节,使用对象对数据库进行操作,进行CRUD就像对象调用方法一样的简单。因此Android Developer用黑体加粗的方式标注了:

文字未免过于干涩,可以用官网上的一幅图来解释Room:

从图中也可以看出,Room主要由三部分组成

Room Database 数据库:底层连接的主要接入点,创建数据库就靠它了。

Data Access Objects DAO:在DAO中会有一系列对数据库进行CRUD的方法声明

Entity 实体类:是对象与数据表的对应表现,设计实体类,并最后转化为对应的数据表

可以这么理解,我们通过实体类的中Getter和Setter方法对数据进行变更操作,然后Room Database使用DAO中的方法,对表中的数据进行对应的操作。从而屏蔽了繁琐的数据库原生操作。当然这其中使用了注解进行功能的标注。

从图上看,感觉Room的确不是很复杂,至少结构上没有太绕的东西。其实从实际操作上来看,Room也的确很简便。

通过实例上手Room

使用Android Studio新建一个RoomDemo的工程,下面可以边实际操作边练习的方式同步进行。

第一步,引入Room

Room在Android Developer的结构中属于Jetpack下面的一个库,在dependencies引入下面的依赖:

即可将Room版本2.2.3的依赖引入工程。引入后,点击Sync now立即同步即可。

第二步,设计考量

打开项目的工程,里面已经存在了一个MainActivity,这将是我们Demo的主界面,那么需要引入Room,我们需要在设计上做哪些工作?

从上图的结构上看,至少Room Database、DAO和Entity都需要我们进行定义。官网的文档也指出,我们需要创建这三个文件,才能正式的使用Room。

Room Database:定义一个抽象类,并继承Room Database

DAO:定义一个接口类

Entity:普通Java Bean类

有了上述的规则,那可以开始动手写了

第三步,定义Entity类

由于Java Bean比较简单,属性就只拿出一个属性来进行解释

给定一个属性id,一般数据库设计都会加入id作为序号属性。

使用 把它声明为数据库的主键,并且还可以设置为自动生成,这样我们构造对象的时候就无需手动指定id这个属性。

即数据表的列信息,使用 指定该属性值在数据表中的列名

下面是Person类的全部内容,有几个值得注意的地方在下面会谈及。

几个值得注意的地方:

Entity类需要使用 注解标注,并且其中的 即数据表名,可以改为自己想取的名字

构造函数:构造函数可以允许多个,但只允许只有一个不加 注解,其它的都得加上 注解,实际运行发现,若多个构造函数不加 ,将无法通过编译。至于多个构造函数的存在是因为CRUD的特性决定的,例如删除,只需要id主键就行了。因此提供了多个构造函数

Getter和Setter方法:这些方法是必须要的,否则无法对对象属性进行读取或修改。

至此,Entity类构造完毕。

第四步,DAO类构建

前面说过DAO类主要是提供对数据库的访问方法,是一个 。通过将SQL语句与方法结合的方式,降低结构的复杂程度。

仍然以CRUD作为DAO类的内容,先看全部的PersonDao文件:

也有几个需要注意的地方

PersonDao接口需要使用 注解进行标注

注意!传递参数的集合,Room通过参数名称进行匹配,若不匹配,则编译出现错误。即当方法中存在参数时,参数名与数据库查询语句的变量名要保持一致,例如 这个方法,如果参数名不一致,编译会报错。

注意删除、修改和增添的返回值的含义。增添的返回值主键索引,而删除和修改的返回值时影响的行数,例如修改一行,那么返回的是1,代表着一行受到影响

注意各个方法均需要对方法的意图进行注解标注。

至此,DAO层也完成了构建

第五步,Room Database类构建

得益于Room的良好封装,这个类的构建步骤只有两步,非常的简单。

创建一个PersonDatabase抽象类并继承自RoomDatabase类

声明一个personDao()的抽象方法并返回PersonDao的对象引用

对,这样就完成了对RoomDatabase的构建,这里要注意引入 注解,它表明需要与哪一个Entity类产生联系,生成对应的数据库表。并且 版本号是一个必填字段,在这里,我们定义为1即可。关于数据库的升级迁移会在第二篇进行阐述。这里标注为1就可以了。

在Activity中操作Room

Room已经完成了需要元素的构建,那么可以将其引入到Activity中来实际操作。来感受一下Room的便捷。

基于MainActivity简单的搭建了一个页面,包含了四个Button和一个TextView,TextView用来展示每次操作对应的结果信息。为了更加方便的截图,同时也将输出的信息通过Log的方式直接打印到控制台上。

在代码中创建数据库访问DAO的对象,最后都需要通过这个对象进行CRUD操作。

可以从源码上看出这三个参数包含如下的含义

Context:为数据库构建的上下文,一般是应用上下文,所以使用getApplicationContext()获取context对象

Classklass:指向标记了 并继承了 的抽象类,这不就直直的指向我们构建的PersonDatabase这个抽象类吗,所以填上 就可以了

name: 数据库文件的名称,这个名称还不能为空,为空或者长度为0都会直接抛出非法参数的异常。

返回值,返回一个可以用来创建数据库的对象。

当拿到数据库对象后,那就可以对数据进行操作了。我们设计的四个按钮下对应着每一个功能,以新增数据的按钮为例,其他几个都几近一致。代码如下:

这里要特别注意的是:虽然Room可以通过调用.allowMainThreadQueries()方法允许在主线程中进行查询,但是实际操作中禁止在主线程操作数据库,避免出现ANR问题。需要开启子线程进行数据的操作!也可以从代码上看出,它调用了Thread对象创建了新的子线程用来处理操作。

实际操作结果如下:

新增数据:

删除一条数据:没有id=4的数据了

更新一条数据:id=9的数据被更新了

总的来看,Room的确操作起来比较简便。

总结

数据持久层是很重要的一个元素,Android Room在简便的使用方法上,为开发者提供了更为友好的功能支持。这篇文章主要是介绍了Android Room以及基本使用方法。后面一篇文章将会介绍如何对数据库进行迁移和升级。

部分参考文献:

Android Developers官网https://developer.android.google.cn/training/data-storage/room

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200225A0LSO200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券