Android Room Library 简单使用

2024-02-28 12:08

本文主要是介绍Android Room Library 简单使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Room 的一些特点

  1. 编译时 sql 语句检查。相信大家都有过 app 跑起来,执行到 db 语句的时候 crash,检查之后发现原来是 sql 语句少了一个 ) 或者其它符号之类的经历。Room 会在编译阶段检查你的 DAO 中的 sql 语句,如果写错了(包括 sql 语法错误跟表名、字段名等等错误),会直接编译失败并提醒你哪里不对。
  2. sql 查询直接关联到 Java 对象。这个应该不用详细解释了,虽然很多第三方 db 库早已经实现。
  3. 耗时操作主动要求异步处理。这一点还是挺值得注意的,Room 会在执行 db 操作时判断是不是在 UI 线程,比如当你需要插入一条记录到数据库时,Room 会让你放到异步线程去做,否则会直接 crash 掉 app 来告诉你不这样做容易阻塞 UI 线程。虽说死相难看了点(个人觉得打个警告不就完了么?),但对于开发者开发出高质量的应用还是有帮助的。
  4. 基于注解编译时自动生成代码。这个应该算是 Room 工作原理的核心所在了,你要写的代码之所以这么少,说白了还不是因为 Google 给你写好了很多?希望以后有时间能写一篇源码分析出来,那个时候再讲吧。
  5. API 设计符合 Sql 标准。方便扩展进行各种 db 操作。

Room 的三大组件

  • Entity。实体,说白了就是我们最常见的一个对象
  • Database。数据库,Room 提供了一个非常方便的静态方法来供我们创建数据库
  • DAO。Data Access Object,把你 Entity 所有的 CRUD 业务代码封装在这里就好

开始使用

Room 的用法,说白了就是创建上面的三大组件,写完了,剩下的交给 Google 就好。

  • 创建一个实体类 UserEntity.java
@Entity(tableName = "user")
public class UserEntity {@PrimaryKey(autoGenerate = true)private int _id;private String name;private String age;public int get_id() {return _id;}public void set_id(int _id) {this._id = _id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public UserEntity(String name, String age) {this.name = name;this.age = age;}
}

划重点:

  1. 顶部使用 @Entity(tableName = "user") 声明这是一个实体类。其中,tableName 如果不写,那么默认类名就是表名。因为我不想创建出来的表名叫 UserEntity,所以我声明了表名叫 user
  2. 属性使用 @PrimaryKey(autoGenerate = true) 声明这是一个主键。其中,autoGenerate = true 代表自动生成,而且会随着数据增加自增长,可以理解成就是 AUTOINCRESEMENT

  3. 创建实体操作接口类 UserEntityDao.java

@Dao
public interface UserEntityDao {@Query("select * FROM User")List getUserList();@Query("select * FROM User WHERE name = :name")UserEntity getUserByName(String name);@Insert(onConflict = OnConflictStrategy.REPLACE)void addUser(UserEntity userEntity);@Delete()void deleteUser(UserEntity userEntity);}

划重点: 1. 顶部使用 @Dao 声明这是 DAO,就是这么简单。 2. CRUD 操作全部使用注解声明,需要具体 sql 语句的,直接在注解里书写就好。具体支持哪些操作可以去 android.arch.persistence.room 包下面查看,我这边就随便写了几个。注意,Room会在编译时检查你的 sql 语句,如果有语法错误,或者表名、字段名错误,都会直接编译报错让你修改,避免运行时出现 crash。 3. 你问我这些接口的实现在哪?答案是:Google 会帮你搞定。是的,你只需要写这些就可以了。

  • 创建数据库抽象类 AppDatabase.java
@Database(entities = {UserEntity.class}, version = 2, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {private static AppDatabase sInstance;public static AppDatabase getDatabase(Context context) {if (sInstance == null) {sInstance = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class,"user.db").build();}return sInstance;}public static void onDestroy() {sInstance = null;}public abstract UserEntityDao getUserEntityDao();}

划重点: 1. 顶部使用 @Database 声明这是一个数据库类,其中 entities里面声明你的数据库里究竟包含了哪几个实体;version 就不用我说了吧,写过 SqliteOpenHelper 的肯定不陌生了;第三个属性 exportSchema 比较有意思,Google 建议是传 true,这样可以把 Scheme 导出到一个文件夹里面,Google 还建议你把这个文件上传到 VCS,具体的可以直接点进去看注释。 2. 这个类封装成单例,在任何地方需要执行数据库操作的时候,可以直接获得来使用,Room 提供了一个静态的方法,用来在默认的构造方法里创建了一个数据库,我在这里起的名称是 user.db。 3. 把所有 Entity 的 DAO 接口类全部声明成 abstract 的到这里来。 4. Google 会在编译时自动帮我们生成这些抽象类和方法的实现,代码在 app/build/generated/source/apt/debug

测试调用

以增加一条数据为例:

UserEntity userEntity = new UserEntity("NAME, "AGE");    
AppDatabase.getDatabase(getApplicationContext()).getUserEntityDao().addUser(userEntity);

上面的语句需要放到异步线程去调用,否则 Room 会直接 crash 掉你的 app 告诉你不这样做容易阻塞 UI 线程。虽然粗暴了一些,但想想也是合理的。再回到这段代码,会发现 Room 在实际场景中的用法非常简单,就是在任何你想操作数据库的地方,先拿到 database 对象,然后再拿到 DAO 对象,接着调用 DAO 里面定义的方法即可。而这些方法的具体实现,我们只需要写少量的 sql 语句,剩下的全部根据注解在编译时自动生成了,Simple and easy。

总结

以上就是对 Room 库使用方法的一个简单介绍,如果你看官方文档一头雾水的话,不如先从这个小例子起步,再对照回官方文档去深挖。其实 Room 的用法以及功能远不止这些,通过与 ViewModel 还有 LiveData 结合,可以轻松实现 db 以及对象的 observable,做到在 UI 的声明周期内,只要 db 数据变化,可以主动更新到 UI,不用再写繁琐的 ContentProvider 与 ContentObserver。而接下来有时间我也会继续学习 Android Architecture Components,争取把这个系列文章继续写下去。

 

 

 

 

 

 

 

这篇关于Android Room Library 简单使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/755462

相关文章

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作