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

Android Room数据库升级Migration解决方案

一、介绍

        Android Room 是 Android 官方提供的一个轻量级数据库框架,用于在 Android 应用程序中管理数据持久性。它简化了数据库访问,提供了更安全、更快速的数据存储方式,并使得数据操作更加便捷。

二、Room的特点(八股文可以参考)

以下是关于 Android Room 数据库的一些关键点:

  1. 数据持久性:Room 框架使您能够轻松地将数据持久化到数据库中,从而在应用程序的生命周期内保持数据的可用性。
  2. SQL 查询简化:使用 Room,您可以使用标准的 SQL 查询语言来查询数据库,同时避免了直接编写 SQL 代码的需要。
  3. 事务管理:Room 自动处理事务,确保数据的一致性和完整性。
  4. 缓存和同步:Room 支持将数据缓存在内存中,并在需要时同步到数据库。
  5. 生命周期感知:Room 的生命周期感知特性意味着它只在应用程序处于活动状态时执行数据库操作,从而优化了性能。
  6. 数据库迁移:随着应用程序的发展和更新,您可能需要更改数据库模式。Room 提供了简便的迁移策略来处理模式更改。
  7. 事务回滚:当遇到问题时,Room 会自动回滚事务,确保数据的完整性。
  8. 支持多种数据类型:Room 支持各种数据类型,如整型、浮点型、字符串等。
  9. 事务隔离级别:根据需要设置事务的隔离级别,以控制并发操作时的数据一致性。
  10. 与其他 SQLite 工具兼容:由于 Room 在内部使用 SQLite,因此它与所有标准的 SQLite 工具和库兼容。

三、数据库升级问题

Room数据库是通过Entity来关联表。一个实体就是一张表,如果实体发生变化了表结构自然发生了变化。如果我们不对数据库进行升级,通过sql事务提交修改,那么这张表在后期会和历史表发生冲突,这是开发者最头疼的问题,那么如果处理这个问题?

处理升级问题,我们应该了解Room是通过什么来管理的。

1.库的管理

数据库管理,其实是数据库的创建,是通过Database,里面最核心的就是version。如果第一次创建,设置一个版本号。

这个版本号会记录当前表的信息,如果表发生了变化,在初始化表的时候,并没有通过升级版本,修改表结构,就会导致在Dao执行事务的时候报错。

2.如何修改表结构

在修改表结构,Room也提供了合并的支持。分为两种

第一种:2.4.0之前的版本,手动

通过数据库创建的时候,新增Migration

Room.databaseBuilder(context,MyDataBase.class,"").addMigrations()

将所有版本的表结构修改的版本号,对应的Migration都添加进来。

    private Migration migration_1_2 = new Migration(1, 2) {@Overridepublic void migrate(@NonNull SupportSQLiteDatabase database) {//一般新增database.execSQL("ALTER TABLE table_name ADD column_name datatype");//修改表名或者数据结构database.execSQL("ALTER TABLE table_name MODIFY COLUMN column_name datatype");//删除database.execSQL("ALTER TABLE table_name DROP COLUMN column_name");}};

Migration:

需要指定就版本与新版本,然后在创建库的时候会进行坚持。

注意:

在使用Room数据的时候,一定要小心,如果你的数据库发生了变化,一定要及时新增migration,否则时间一长,可能改的面目全非。所以,在新设计表的时候一定要要注意以后的扩展

第二种:自动升级方案

在2.4.0以后,升级可以通过@DataBase里面的autoMigrations来完成,但是需要Java11支持

public @interface Database {Class<?>[] entities();Class<?>[] views() default {};int version();*/boolean exportSchema() default true;@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)Class<?>[] autoMigrations() default {};
}
@Database(autoMigrations = {@AutoMigration(from = 1,to = 2,spec = MyDataBase.AutoMirgation1.class )})

自动版本基本和手动差不多,只是采取kapt,和注入方式,不需要开发者再手写代码,降低了开发难度。

您可以使用 AutoMigrationSpec 为 Room 提供正确生成迁移路径所需的额外信息。定义一个在 RoomDatabase 类中实现 AutoMigrationSpec 的静态类,并为其添加以下一项或多项注解:

  • @DeleteTable :删除表
  • @RenameTable:重新命名表名
  • @DeleteColumn:删除列
  • @RenameColumn:重新命名列

自动提供了上面几种:

    @DeleteColumn(tableName = "",columnName ="")static   class AutoMirgation1 implements AutoMigrationSpec{@Overridepublic void onPostMigrate(@NonNull SupportSQLiteDatabase db) {AutoMigrationSpec.super.onPostMigrate(db);}}

如果需要新增,同样也可以在db里面新增,通过execSql语句来完成。

三、代码里过多的Migration是否可以删除?

不可以,即使你表发生了很大的变化,你也不能随便删除之前修改的,如果删除了,会导致之前有很多用户表有升级到最新,导致后期升级上来,丢了中间的表变化,这样早执行Dao的时候,直接crash。所以最好的办法是在创建自己的RoomDataBase的时候,所有关于变化的都放在数据库类中,方便管理

四、总结

通过以上的分析,我们详细的明白Room数据的升级或者数据迁移的两种方式,手动需要自己手写代码,自动也可以手写,但是自动需要JDK 11支持。还有就是手动mirgation的时候要保留之前的,不能删除,否则对之前的版本会造成无法升级的影响

相关文章:

Android Room数据库升级Migration解决方案

一、介绍 Android Room 是 Android 官方提供的一个轻量级数据库框架&#xff0c;用于在 Android 应用程序中管理数据持久性。它简化了数据库访问&#xff0c;提供了更安全、更快速的数据存储方式&#xff0c;并使得数据操作更加便捷。 二、Room的特点(八股文可以参考) 以下是…...

离线安装docker和docker-compose

1.下载 docker Index of linux/static/stable/x86_64/ docker-compose Overview of installing Docker Compose | Docker Docs 2.docker /etc/systemd/system/docker.service [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.…...

奇怪的事情记录:外置网卡和外置显示器不兼容

身为程序员&#xff0c;不应该对世界上的稀奇古怪的事情感到惊讶&#xff08;毕竟&#xff0c;大部分都是程序员自己搞出来的&#xff09;。 外置网卡和外置显示器不兼容 mbp2019intel版&#xff0c;win10&#xff0c;外接有线网卡&#xff0c;平时用得很好&#xff0c;接上外…...

【大数据进阶第三阶段之Hive学习笔记】Hive基础入门

目录 1、什么是Hive 2、Hive的优缺点 2.1、 优点 2.2、 缺点 2.2.1、Hive的HQL表达能力有限 2.2.2、Hive的效率比较低 3、Hive架构原理 3.1、用户接口&#xff1a;Client 3.2、元数据&#xff1a;Metastore 3.3、Hadoop 3.4、驱动器&#xff1a;Driver Hive运行机制…...

第三代量子计算机交付,中国芯片开辟新道路,光刻机难挡中国芯

日前安徽本源量子宣布第三代超导量子计算系统正式上线&#xff0c;这是中国最先进的量子计算机&#xff0c;计算量子比特已达到72个&#xff0c;在全球已居于较为领先的水平&#xff0c;这对于中国芯片在原来的硅基芯片受到光刻机阻碍无疑是巨大的鼓舞。 据悉本源量子的第一代、…...

react native中使用tailwind并配置自动补全

使用的第三方库是tailwind-react-native-classnames&#xff0c;同类的也有tailwind-rn&#xff0c;但是我更喜欢前者官方demo&#xff1a; import { View, Text } from react-native; import tw from twrnc;const MyComponent () > (<View style{twp-4 android:pt-2 b…...

数据分析——火车信息

任务目标 任务 1、整理火车发车信息数据&#xff0c;结果的表格形式为&#xff1a; 2、并输出最终的发车信息表 难点 1、多文件 一个文件夹&#xff0c;多个月的发车信息&#xff0c;一个excel&#xff0c;放一天的发车情况 2、数据表的格式特殊 如何分析表是一个难点 数…...

Bert-vits2最终版Bert-vits2-2.3云端训练和推理(Colab免费GPU算力平台)

对于深度学习初学者来说&#xff0c;JupyterNoteBook的脚本运行形式显然更加友好&#xff0c;依托Python语言的跨平台特性&#xff0c;JupyterNoteBook既可以在本地线下环境运行&#xff0c;也可以在线上服务器上运行。GoogleColab作为免费GPU算力平台的执牛耳者&#xff0c;更…...

Asp .Net Web应用程序(.Net Framework4.8)网站发布到IIS

开启IIS 如果已开启跳过这步 打开控制面板-程序 打开IIS 发布Web程序&#xff08;.Net Framework 4.8 web网页&#xff09; 进入IIS管理器新建一个应用池 新建一个网站 网站创建完毕 为文件夹添加访问权限 如果不添加访问权限&#xff0c;运行时将会得到如下错误 设置权限 勾…...

vue element plus Typography 排版

我们对字体进行统一规范&#xff0c;力求在各个操作系统下都有最佳展示效果。 字体# 字号# LevelFont SizeDemoSupplementary text12px Extra SmallBuild with ElementBody (small)13px SmallBuild with ElementBody14px BaseBuild with ElementSmall Title16px MediumBuild w…...

理论U3 决策树

文章目录 一、决策树算法1、基本思想2、构成1&#xff09;节点3&#xff09;有向边/分支 3、分类步骤1&#xff09;第1步-决策树生成/学习、训练2&#xff09;第2步-分类/测试 4、算法关键 二、信息论基础1、概念2、信息量3、信息熵&#xff1a; 二、ID3 (Iterative Dichotomis…...

Redis 常用操作

一、Redis常用的5种数据类型 字符串&#xff08;String&#xff09;&#xff1a;最基本的数据类型&#xff0c;可以存储字符串、整数或浮点数。哈希&#xff08;Hash&#xff09;&#xff1a;键值对的集合&#xff0c;可以在一个哈希数据结构中存储多个字段和值。列表&#xf…...

c# 使用Null合并操作符例子

在这个示例中&#xff0c;我们定义了两个字符串变量 name 和 defaultName。变量 name 被赋值为 null&#xff0c;而变量 defaultName 被赋值为 “John Doe”。 接下来&#xff0c;我们使用 Null 合并操作符 ?? 来获取一个非空值。如果 name 不为 null&#xff0c;则 result 的…...

【Docker】docker部署conda并激活环境

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、新建dockerfile文件二、使用build创建镜像1.报错&#xff1a;Your shell has not been properly configured to use conda activate.…...

HarmonyOS@Link装饰器:父子双向同步

Link装饰器&#xff1a;父子双向同步 子组件中被Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。 说明 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 概述 Link装饰的变量与其父组件中的数据源共享相同的值。 装饰器使用规则说明 Link变…...

【idea】idea插件编写教程,博主原创idea插件 欢迎下载

前言&#xff1a;经常使用Objects.equals(a,b)方法的同学 应该或多或少都会因为粗心而传错参&#xff0c; 例如日常开发中 我们使用Objects.equals去比较 status(入参)&#xff0c;statusEnum(枚举), 很容易忘记statusEnum.getCode() 或 statusEnum.getVaule() &#xff0c;再比…...

深入理解 Hadoop (四)HDFS源码剖析

HDFS 集群启动脚本 start-dfs.sh 分析 启动 HDFS 集群总共会涉及到的角色会有 namenode, datanode, zkfc, journalnode, secondaryName 共五种角色。 JournalNode 核心工作和启动流程源码剖析 // 启动 JournalNode 的核心业务方法 public void start() throws IOException …...

【Vue3+React18+TS4】1-1 : 课程介绍与学习指南

本书目录&#xff1a;点击进入 一、为什么做这样一门课程? 二、本门课的亮点有哪些? 2.1、轻松驾驭 2.2、体系系统 2.3、高效快捷 2.4、融合贯通 三、课程内容包括哪些? 四、项目实战 《在线考勤系统》 五、课适合哪些同学? 一、为什么做这样一门课程? 近十年内前端…...

Nacos与Eureka的区别详解

Nacos与Eureka的区别详解 在微服务架构中,服务注册与发现是核心组件之一,它们允许服务实例在启动时自动注册,并且能被其他服务发现,从而实现服务之间的互相通信。Nacos和Eureka都是现代微服务体系中广泛使用的服务注册与发现工具。本文将深入分析二者的区别,并为您提供一…...

【算法刷题】Day28

文章目录 1. 买卖股票的最佳时机 III题干&#xff1a;算法原理&#xff1a;1. 状态表示&#xff1a;2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码&#xff1a; 2. Z 字形变换题干&#xff1a;算法原理&#xff1a;1. 模拟2. 找规律 代码&#xff1a; 1. 买卖股票的最佳时…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...