安卓中Room持久化库的使用

news2024/9/22 10:26:17

在这里插入图片描述
在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 helpers
    testImplementation "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 {
    @Insert
    void insert(User user);

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

    @Delete
    void delete(User user);

    @Update
    void 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;

        //创建数据库appdatabase
        appDatabase = 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 {
    @TypeConverter
    public static Date fromTimestamp(Long value) {
        return value == null ? null : new Date(value);
    }

    @TypeConverter
    public 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.coloradmin.cn/o/2041962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32CubeMX学习记录——配置定时器

文章目录 前言一、学习目的二、CubeMX配置三、代码编写 一、学习目的 在STM32学习中&#xff0c;定时器是一个非常重要的组成部分。本文将详细记录如何通过CubeMX工具配置定时器&#xff0c;以实现1ms的定时功能。&#xff08;附计算公式&#xff09; 二、CubeMX配置 &#xf…

锂电搅拌设备实现产线可视化

锂离子电池生产过程中的搅拌设备是确保电池性能与一致性的重要环节。随着智能制造和工业4.0概念的深入发展&#xff0c;实现锂电搅拌设备的产线可视化与信息化已成为提升生产效率、优化产品质量、降低运营成本的关键路径。这一转变不仅要求技术上的革新&#xff0c;还涉及到管理…

如何在 .NET 中实现 SM3withSM2 签名:详细步骤和示例代码

下面是一个详细的示例&#xff0c;展示如何在 .NET 中实现 SM3withSM2 签名和验证&#xff0c;包括生成密钥对、计算哈希、签名和验证。示例使用了 BouncyCastle 库&#xff0c;你可以根据实际需求对代码进行调整。 1. 安装依赖库 使用 NuGet 安装 BouncyCastle 库&#xff1a…

ThinkPHP5.0.15漏洞解析及SQL注入

第一步&#xff1a; 通过查看5.0.15和5.0.16版本的对比&#xff0c;可以看到16版本对在Builder.php里面对数据库的增减做了修正&#xff0c;所以可以15版本的漏洞就存在在这里。这里的代码用的拼接的方式&#xff0c;就可以尝试使用报错注入来实现。 第二步&#xff1a; 我们…

音视频开发继续学习

RGA模块 RGA模块定义 RGA模块是RV1126用于2D图像的裁剪、缩放、旋转、镜像、图片叠加等格式转换的模块。比方说&#xff1a;要把一个原分辨率1920 * 1080的视频压缩成1280 * 720的视频&#xff0c;此时就要用到RGA模块了。 RGA模块结构体定义 RGA区域属性结构体 imgType&am…

一文搞定SQLite数据库

文章目录 SQLite数据库一、SQLite简介1、简介2、SQLite特性3、适用场景4、不适用场景5、如何选择 二、SQLite安装1、下载2、安装 三、SQLite基本语法1、数据库操作①、新建数据库②、查看数据库③、查看帮助指令 2、表操作①、新增表②、查看表信息③、查看表索引信息④、查看表…

dataV组件使用——数据更新更新组件

bug 当数据更新只更新一个属性页面不会刷新&#xff08;this.config1.data arr;&#xff09; 必须重新赋值整个config 方式一&#xff1a;检测到数据更新重新赋值config this.config1 {data: arr,header: ["所在单位", "人员姓名", "职位", &q…

【前端模式设计】js订阅发布模式之我见

一知半解最可怕 /*** description 订阅发布通知*/ export class SubscriptionPublish {private eventMap: Record<string, ((params: any) > any)[]>;constructor() {this.eventMap {};}on(key: string, handler: (params: any) > any) {if (!this.eventMap[key]…

星露谷模组开发教程#7 自定义机器

首发于Enaium的个人博客 添加大型工艺品 机器也算是大型工艺品&#xff0c;所以我们需要先添加它的大型工艺品。 这里做一张16x32格式为png的图。 if (e.Name.IsEquivalentTo("Data/BigCraftables")) {e.Edit(assets >{var dict assets.AsDictionary<string…

动手学深度学习——02深度学习介绍

AI 地图 X 轴&#xff1a;不同的模式&#xff08;越往右时间越新&#xff09; 符号学概率模型&#xff1a;统计学模型机器学习 Y 轴&#xff1a;问题领域&#xff08;先要了解一个东西&#xff0c;然后通过推理形成知识&#xff0c;最后做规划&#xff09; 感知&#xff1a;…

【C++】特殊类设计类型转换

目录 &#x1f4a1;前言一&#xff0c;特殊类设计1. 请设计一个类&#xff0c;不能被拷贝2. 请设计一个类&#xff0c;只能在堆上创建对象3. 请设计一个类&#xff0c;只能在栈上创建对象4. 请设计一个类&#xff0c;不能被继承5. 请设计一个类&#xff0c;只能创建一个对象(单…

Web3与医疗健康:去中心化技术在医疗行业的应用前景

随着区块链技术和去中心化理念的兴起&#xff0c;Web3作为新一代互联网技术正逐渐影响各个行业。在医疗健康领域&#xff0c;Web3技术的应用前景引起了广泛关注。本文将探讨Web3如何通过去中心化技术提升医疗健康行业的效率、透明度和安全性&#xff0c;并分析其在实际应用中的…

Docker 部署 SkyWalking 的指南

Docker 部署 SkyWalking 的指南 SkyWalking 是一款开源的应用性能监控工具&#xff0c;特别适用于分布式系统。通过 Docker 部署 SkyWalking&#xff0c;可以简化安装和配置过程。本文将详细介绍如何使用 Docker 部署 SkyWalking。 环境准备 在开始之前&#xff0c;请确保你…

LeetCode-3148. 矩阵中的最大得分

本人算法萌新,为秋招找工作开始磨炼算法,算法题均用python实现,如果我有哪些地方做的有问题的,还请大家不吝赐教. 1.题干 给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格&#xff08;不必相邻&…

小程序实现设备消息订阅

小程序实现设备消息订阅 一、说明 先说明一下什么是小程序的消息订阅&#xff0c;其实就是在小程序进行某个消息的订阅&#xff0c;订阅以后就可以在微信收到推送的消息了。推送走的服务端&#xff0c;在服务端调用微信的推送接口&#xff0c;然后推送至指定的微信用户。 二…

xlua热补丁

print("*********第一个热补丁***********")--直接写好代码 运行 是会报错的 --我们必须做4个非常重要的操作 --1.加特性 --2.加宏 第一次开发热补丁需要加 --3.生成代码 --4.hotfix 注入 --注入时可能报错 提示你要引入Tools--热补丁的缺点&#xff1a;只要我们修改…

无人值守变电站视频监控统一接入系统方案

目录 一、背景介绍 1、无人值守变电站 2、特点 二、需求分析 1、基本需求 2、需求分析 三、目标和网络 1、设计目标 2、系统网络建设目标 四、系统组成 1、总体架构图 2、前端采集层 &#xff08;1&#xff09;摄像头 &#xff08;2&#xff09;传感器 &#xf…

Qt——多线程

一、QThread类 如果要设计多线程程序&#xff0c;一般是从QThread继承定义一个线程类&#xff0c;并重新定义QThread的虚函数 run() &#xff0c;在函数 run() 里处理线程的事件循环。 应用程序的线程称为主线程&#xff0c;创建的其他线程称为工作线程。主线程的 start() 函数…

猫头虎 分享已解决Bug || Failed to start docker.service: Unit not found. 解决方案

猫头虎 分享已解决Bug || Failed to start docker.service: Unit not found. 解决方案 今天猫头虎带您解决一个在运维工作中常见的问题&#xff1a; Failed to start docker.service: Unit not found.。这是一个困扰了许多运维小伙伴的问题&#xff0c;尤其是在部署Docker时&a…

安全测试担心效果不好?这3个安全测试工具你用了吗?

其实在信息科技发展的初期&#xff0c;很多互联网公司就有意识到保护软件产品安全的重要性。但时至今日&#xff0c;我们还是经常能看到某某app软件泄露用户隐私信息&#xff0c;或遭受黑客攻击导致一些损失&#xff0c;其中不乏有一定市场地位的大厂。此类信息安全问题屡见不鲜…