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

2024-01-07 06:28

本文主要是介绍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解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现