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

相关文章

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

怎么关闭Ubuntu无人值守升级? Ubuntu禁止自动更新的技巧

《怎么关闭Ubuntu无人值守升级?Ubuntu禁止自动更新的技巧》UbuntuLinux系统禁止自动更新的时候,提示“无人值守升级在关机期间,请不要关闭计算机进程”,该怎么解决这个问题?详细请看... 本教程教你如何处理无人值守的升级,即 Ubuntu linux 的自动系统更新。来源:https://

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

Xshell远程连接失败以及解决方案

《Xshell远程连接失败以及解决方案》本文介绍了在Windows11家庭版和CentOS系统中解决Xshell无法连接远程服务器问题的步骤,在Windows11家庭版中,需要通过设置添加SSH功能并... 目录一.问题描述二.原因分析及解决办法2.1添加ssh功能2.2 在Windows中开启ssh服务2

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora