当前位置: 首页 > news >正文

安卓中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开发的需求。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 哈希 | Java | (hot100) 力扣 49
  • 重头开始嵌入式第十九天(Linux系统编程 文件IO)
  • Android-->产物收集(含apk文件重命名, aab文件重命名)
  • Mutual_Voting_for_Ranking_3D_Correspondences
  • AFSim 仿真系统----坐标系统
  • 基于CNN的医学X-Ray图像分类全程解析
  • 在Notebook中使用backtrader绘图出现 Javascript Error: IPython is not defined
  • CUDA编程06 - 性能优化指南
  • 【微信小程序】WXSS 模板样式
  • 详解C++的四大特性(封装,继承,多态,抽象)
  • 大数据信用报告查询哪家平台的比较好?
  • 视频美颜SDK的核心技术与直播美颜插件的开发详解
  • 国内首个支持国产化信创的开源云原生平台
  • 业界首个OpenTelemetry结合eBPF的向导式可观测性平台APO正式开源
  • 数据结构(5.5_2)——并查集
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • echarts的各种常用效果展示
  • ESLint简单操作
  • iOS 颜色设置看我就够了
  • JavaScript 基础知识 - 入门篇(一)
  • Java教程_软件开发基础
  • jquery cookie
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • linux学习笔记
  • Vue--数据传输
  • 阿里云购买磁盘后挂载
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 试着探索高并发下的系统架构面貌
  • 微服务入门【系列视频课程】
  • 为什么要用IPython/Jupyter?
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • ​linux启动进程的方式
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • (06)Hive——正则表达式
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)UDP基本编程步骤
  • (转)jdk与jre的区别
  • (转)编辑寄语:因为爱心,所以美丽
  • .java 9 找不到符号_java找不到符号
  • .mysql secret在哪_MySQL如何使用索引
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • @Mapper作用
  • @ModelAttribute 注解
  • @vue/cli 3.x+引入jQuery
  • [Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解
  • [Android]创建TabBar