安卓中Room持久化库的使用

在这里插入图片描述
在Android开发中,Room是Google提供的一个持久化库,旨在为应用提供SQLite的抽象层,以简化数据库的访问和操作。相比直接使用SQLite,Room提供更清晰、更简洁的数据库访问机制。


1. Room的基础知识

1.1 引入Room依赖

首先,在你的项目的build.gradle (Module: app) 文件中添加Room的依赖:

dependencies {def room_version = "2.4.3"implementation "androidx.room:room-runtime:$room_version"annotationProcessor "androidx.room:room-compiler:$room_version"// 可选 - RxJava支持implementation "androidx.room:room-rxjava3:$room_version"// 可选 - Guava支持 (使用ImmutableList等)implementation "androidx.room:room-guava:$room_version"// Test helperstestImplementation "androidx.room:room-testing:$room_version"
}

确保替换room_version为最新的版本。

1.2 创建数据库实体

在Room中,每个数据库表由一个实体类表示。以下是一个示例实体类:

@Entity(tableName = "users")
public class User {@PrimaryKey(autoGenerate = true)private int id;@ColumnInfo(name = "first_name")private String firstName;@ColumnInfo(name = "last_name")private String lastName;// 构造函数、getter和setter省略
}

1.3 定义DAO(Data Access Object)

DAO是一个接口,定义了访问数据库的各种方法。Room将DAO的声明转换为实际的数据库代码。

@Dao
public interface UserDao {@Insertvoid insert(User user);@Query("SELECT * FROM users")List<User> getAllUsers();@Deletevoid delete(User user);@Updatevoid update(User user);
}

1.4 创建数据库类

Room数据库类是访问数据库的主要入口点。使用@Database注释来标记它,并列出所有的实体和版本号。

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {public abstract UserDao userDao();
}

2. 使用Room数据库

2.1 获取数据库实例

通常你会使用单例模式来创建和管理数据库实例,避免频繁开销大的资源消耗。

public class DatabaseClient {private Context mCtx;private static DatabaseClient mInstance;// 我们的app数据库对象private AppDatabase appDatabase;private DatabaseClient(Context mCtx) {this.mCtx = mCtx;//创建数据库appdatabaseappDatabase = Room.databaseBuilder(mCtx, AppDatabase.class, "MyToDos").build();}public static synchronized DatabaseClient getInstance(Context mCtx) {if (mInstance == null) {mInstance = new DatabaseClient(mCtx);}return mInstance;}public AppDatabase getAppDatabase() {return appDatabase;}
}

2.2 执行数据库操作

使用DAO执行数据库操作。所有的数据库操作默认不在主线程执行。

// 插入
DatabaseClient.getInstance(getApplicationContext()).getAppDatabase().userDao().insert(new User(0, "John", "Doe"));// 获取用户
List<User> users = DatabaseClient.getInstance(getApplicationContext()).getAppDatabase().userDao().getAllUsers();

3. 进阶用法

3.1 复杂查询与LiveData

Room支持返回LiveDataFlowable对象,使得数据库的响应可以观察并自动更新UI。

@Query("SELECT * FROM users")
LiveData<List<User>> getLiveUsers();

3.2 数据库迁移

随着应用的发展,您可能需要修改数据库架构。Room可以通过数据库迁移脚本来处理架构变化:

Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").addMigrations(MIGRATION_1_2, MIGRATION_2_3).build();

3.3 Type Converters

如果你需要存储自定义数据类型,那么Type Converters是必需的。

public class Converters {@TypeConverterpublic static Date fromTimestamp(Long value) {return value == null ? null : new Date(value);}@TypeConverterpublic static Long dateToTimestamp(Date date) {return date == null ? null : date.getTime();}
}

将Converter类添加到数据库定义中:

@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {public abstract UserDao userDao();
}

4. 测试与维护

4.1 编写单元测试

Room提供了便捷的工具来帮助开发者编写数据库操作的单元测试。

4.2 维护提示

  • 始终使用最新版本的Room以利用最新功能和安全修复。
  • 监视SQL查询性能,特别是在大量数据操作时。
  • 规范地使用DAO和数据库实例,避免在应用中创建多个实例。

5. 结论

Room库为Android数据库操作提供了一种结构化而现代的方式,极大简化了数据库开发工作。此外,整合RxJava、LiveData等组件可以使得Room的使用更加高效和符合现代Android开发的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/401242.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GB/T 38082-2019 生物降解塑料购物袋检测

生物降解塑料购物袋是指以生物降解树脂为主要原料制得的&#xff0c;具有提携结构的&#xff0c;在销售、服务等场所用于盛装及携提商品的袋制品。 GB/T 38082-2019 生物降解塑料购物袋检测项目&#xff1a; 检测项目 测试标准 尺寸偏差 GB/T 38082 感官 GB/T 38082 提掉…

谷粒商城实战笔记-190-192商城业务-检索服务-面包屑导航

文章目录 一&#xff0c;什么是面包屑导航1&#xff0c;京东商城的面包屑2&#xff0c;面包屑是怎么产生的 二&#xff0c;面包屑导航的后台实现 这三节的主要内容是开发面包屑的前后端功能。 190-商城业务-检索服务-面包屑导航191-商城业务-检索服务-条件删除与URL编码问题192…

阿一网络安全实战演练之利用 REST URL 中的服务器端参数污染

所需知识 要解决这个实验室问题&#xff0c;您需要了解以下内容&#xff1a; 如何确定用户输入是否包含在服务器端的 URL 路径或查询字符串中。如何使用路径遍历序列尝试更改服务器端请求。如何查找 API 文档。 这些内容在我们的 API 测试学院主题中有涵盖。 进入实验室 研…

【Docker安装】Ubuntu系统下离线部署Docker环境教程

【Docker安装】Ubuntu系统下离线部署Docker环境教程 前言一、本次实践介绍1.1 本次实践规划1.2 本次实践简介二、检查本地环境2.1 检查操作系统版本2.2 检查内核版本2.3 更新软件源三、卸载Docker四、下载安装包4.1 创建目录4.2 官网下载五、部署Docker环境5.1 解压安装包5.2 复…

Web Image scr图片从后端API获取基本实现

因系统开发中需求&#xff0c;会有页面显示图片直接从后端获取后显示&#xff0c;代码如下&#xff1a; 后端&#xff1a; /*** 获取图片流* param response* param fileName*/RequestMapping(value"getImgStream",method RequestMethod.GET)public void getImgStr…

Yearning开源SQL审核平台本地Linux系统部署与远程登录语句审核

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 本文主要介绍在 Linux 系统简单部署 Yearning 并结合 cpolar 内网穿透工具实现远程访问&#xff0c;破除…

Java基础入门15:算法、正则表达式、异常

算法&#xff08;选择排序、冒泡排序、二分查找&#xff09; 选择排序 每轮选择当前位置&#xff0c;开始找出后面的较小值与该位置交换。 选择排序的关键&#xff1a; 确定总共需要选择几轮&#xff1a;数组的长度-1。 控制每轮从以前位置为基准&#xff0c;与后面元素选择…

Typescript在AI产品中应用越来越广泛

AI产品中的应用 TypeScript 在 AI 产品中的应用逐渐增多&#xff0c;主要得益于其提供的类型安全、面向对象编程和模块化等特性&#xff0c;这些特性使得开发者能够构建可维护、可扩展和高性能的应用程序。 首先&#xff0c;TypeScript 作为 JavaScript 的超集&#xff0c;通…

15.基于session实现登录 前端项目部署

前端项目nginx部署 nginx配置文件 worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_type application/json;sendfile on;keepalive_timeout 65;server {listen 8080;server_name localhost;# 指定前端项目所…

线性DP(动态规划)

文章目录 数字三角形思路代码 最长上升子序列1思路代码 最长公共子序列思路代码 其实和背包一样&#xff0c;都不固定&#xff0c;这种类型的题每一道题都需要自己从之前的经验中去摸索。 数字三角形 题目链接 思路 只能从左上或者右上走过来&#xff0c;用一个二维数组&am…

python-A+B again

[题目描述] 小理有一个非常简单的问题给你&#xff0c;给你两个整数 A 和 B&#xff0c;你的任务是计算 AB。输入格式&#xff1a; 输入共 2∗T1 行。 输入的第一行包含一个整数 T 表示测试实例的个数&#xff0c;然后 2∗T 行&#xff0c;分别表示 A 和 B 两个正整数。注意整数…

计算机网络面试题汇总

文章目录 计算机网络基础计算机网络体系结构(网络分层模型)OSI 七层模型是什么?每一层的作用是什么?TCP/IP 四层模型是什么?每一层的作用是什么?五层体系结构以及对应的协议为什么网络要分层,分层的好处?常见网络协议有哪些,每一层常见协议有哪些?应用层有哪些常见的协…

mysql5.7安装

1.创建一个software文件 2.先下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 3安装源包 rpm -ivh mysql-community-release-el7-5.noarch.rpm 可能会报错 改成命令 rpm -ivh mysql-community-release-el7-5.noarch.rpm --nodeps…

目标检测 | yolov6 原理和介绍

前言&#xff1a;目标检测 | yolov5 原理和介绍 后续&#xff1a; 1.简介 YOLOv6是由美团视觉智能部研发的一款目标检测框架&#xff0c;专注于工业应用&#xff0c;致力于提供极致的检测精度和推理效率。相较于YOLOv4和YOLOv5&#xff0c;YOLOv6在网络结构方面进行了深入优化…

在LabVIEW中高效读取大型CSV文件的方法

当尝试使用“读取分隔的电子表格VI”从大型CSV文件&#xff08;数百MB&#xff09;中读取数据时&#xff0c;可能会遇到内存已满错误。这是因为该VI会一次性读取整个文件并将其转换为数值数组&#xff0c;导致占用大量内存。 解决方案 可以使用“从文本文件VI读取”来部分读取…

技术探索之android项目结构

在新建项目时会自动生成很多文件&#xff0c;需要知道项目结构&#xff0c;我们需要编辑的文件的位置&#xff1a; app: 项目的代码资源都在其中&#xff0c;是我们工作的核心目录 build &#xff1a; 编译生成文件。生成的apk就在build/outputs/apk/debug里。apk在虚拟机里就…

MySQL——内置函数

时间函数 select * from msg where date_add(sendtime, interval 2 minute) > now(); 理解&#xff1a; ------------------------------|-----------|-------------|------------------ 初始时间 now() 初始时间2min 字符串 length函数返回字符串长度&#xff0c;以字节为…

【docker】docker数据卷与网络部署服务

Docker 网络模式 选择网络模式 Host Mode (主机模式) 特点: 容器与宿主机共享网络命名空间操作: docker run --nethost ... Container Mode (容器模式) 特点: 容器与指定容器共享网络命名空间操作: docker run --netcontainer:<container-id-or-name> ... None Mode (无…

营业额统计

文章目录 概要整体架构流程技术细节小结 概要 营业额统计是商业活动中一个非常重要的环节&#xff0c;它可以帮助企业了解自身的经营状况&#xff0c;并为决策提供依据。 需求分析以及接口设计 营业额统计是基于折现图来展现&#xff0c;并且按照天来展示的。实际上&#xf…

机器学习(1)--数据可视化

文章目录 数据可视化作用可视化方法实现可视化 总结 数据可视化 数据可视化是将数据以图形、图像、动画等视觉形式表示出来&#xff0c;以便人们能够更直观地理解、分析和交流数据中的信息。 作用 一个整理的好好的数据&#xff0c;我们为什么要将其可视化呢&#xff1f;将它…