Room数据库自动升级

以前在安卓端使用数据库存储数据时,总是不可避免地后期涉及到数据库升级的问题,在早期Room版本中,需要编写对应的sql文件来处理对应版本升级的问题,这样很容易出现问题,比如少写了某些字段的处理,这些问题造成的后果就是APP崩溃闪退

以前在安卓端使用数据库存储数据时,总是不可避免地后期涉及到数据库升级的问题,在早期Room版本中,需要编写对应的sql文件来处理对应版本升级的问题,这样很容易出现问题,比如少写了某些字段的处理,这些问题造成的后果就是APP崩溃闪退

private static Migration migration1_2 = new Migration(1, 2) {
    @Override
    public void migrate(@NonNull SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE Repo"
                + " ADD COLUMN age INTEGER ");
     
    }};

private static RepoDatabase create(final Context context) {
    return Room.databaseBuilder(
            context,
            RepoDatabase.class,
            DB_NAME)
            .addMigrations(migration1_2)
            .build();}// 修改版本号@Database(entities = Repo.class, version = 2)

可能大多数人都遇到过,我就在线上环境出现过这种问题,结果就不用说了,哈哈

image.png


后来,在2.4.0版本开始,room加入了一项重要功能------自动迁移,专门用于简化数据库升级的问题,最大程度避免了数据库升级过程中存在的各种问题,简直不要太好用

image.png


具体使用步骤:


  1. 首先,你需要把room版本升级为至少2.4.0

    //Room数据库: https://developer.android.google.cn/jetpack/androidx/releases/room
    def room_version = "2.4.0"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation  "androidx.room:room-ktx:$room_version"
  1. 增加schemas文件输出配置,这个是用来生成每个数据库版本对应的数据库结构文件,在自动迁移数据库的时候就是根据这个结构的差异,来进行自动迁移处理的,配置完之后,运行项目,会在对应的目录下生成对应数据库版本的文件,这些记得保存,不要改动(千万不要改动)

 defaultConfig {

        ......

        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
    }

image.png

  1. 如果有数据库结构变动,则修改对应的数据库版本,并添加自动升级配置,比如从1升级到2,那就吧version改为2,并添加 AutoMigration(from = 1, to = 2)

@Database(entities = [Inspiration::class, Daiban::class, SportClass::class, SportLog::class], version = 3, autoMigrations = [
    AutoMigration(from = 1, to = 2),
    AutoMigration(from = 2, to = 3),])abstract class AppDataBase : RoomDatabase() {

    abstract fun inspirationDao(): InspirationDao    abstract fun daibanDao(): DaibanDao    abstract fun sportDao(): SportDao}

至此自动化迁移工作就完成了,就是这么简单,装个数据库版本为1的app,然后用新版本覆盖,数据库就会自动完成迁移配置

可能遇到的问题:

在开发过程中因为会频繁修改数据库,所以,如果出现数据库字段迁移问题的话,就直接卸载重新安装就可以了,不用频繁修改version,但是在上线前一定要检查数据库自动迁移是否正常,避免把问题暴露在生产环境中,具体验证方式就是手机上先安装前一个版本的上线包,然后运行即将上线的新版本代码覆盖旧版本,检查数据库文件是否正常迁移,如果存在问题则针对具体的问题进行修复
最后,提供一个走投无路的操作,如果数据不是特别重要的话,可以开启破坏性重建fallbackToDestructiveMigration,避免APP崩溃至于具体作用,大家就看文档注释吧,这是一个下下策,慎用

Room.databaseBuilder(context, AppDataBase::class.java, "Record_Things_db")
                .fallbackToDestructiveMigration()
                .build()


来源: 互联网
本文观点不代表码客-全球程序员交流社区立场,不承担法律责任,文章及观点也不构成任何投资意见。

赞 ()

相关推荐

  • 置顶 开发项目接单群,免费入群了

    无论你是Android、ios、java、php,或者你是产品经理、老板,都可以免费入群接单或者发布项目,全程不收取任何费用。

    2025年02月21日 15点27分
  • 在APP中如何获取用户截屏事件

    在Android开发中,要获取用户截屏信息并实现截屏检测功能,可通过以下几种方案实现。这些方案基于不同的技术原理,适用于不同场景和系统版本,开发者需根据需求选择合适的方法:

    2025年03月05日 14点54分
  • 鸿蒙Next-AttributeModifier结合@Styles和@Extend深度解析使用

    声明式语法引入了@Styles和@Extend两个装饰器,可以解决复用相同自定义样式的问题,但是存在以下受限场景:

    2025年03月03日 15点40分
  • ConstraintLayout之layout_constraintDimensionRatio属性详解

    layout_constraintDimensionRatio 是 ConstraintLayout 提供的一个强大功能,它可以让 View 按照固定的宽高比例自适应尺寸。使用这个属性,可以在 ConstraintLayout 中根据已知的宽度或高度,自动计算另一个维度,确保 View 保持特定的宽高比。

    2025年03月03日 15点39分
  • Android事件分发时,你浓眉大眼的onTouch()竟然没有执行?

    在开发需求时,有这么一个场景:Activity中有一个ViewGroup作为Parent,ViewGroup里面又有一个Webview作为Child。当一进入页面时,系统输入法自动弹起,而在点击Parent区域时,需要收起系统输入法。背景介绍完毕,当时的第一想法就是通过Parent设置setOnTouchListener,然后在onTouch()回调中来实现:

    2025年03月02日 15点10分
  • Android SDK封装与发布实战指南

    Android SDK封装与发布实战指南

    2025年03月02日 15点05分
  • 鸿蒙Next开发-添加水印以及点击穿透设置

    在鸿蒙Next中,为App全局添加水印可以通过以下方式实现,其中通过窗口添加水印是一种常见且高效的方式。以下是具体方案和实现细节:

    2025年02月26日 23点15分
  • 鸿蒙Next开发-普通函数和箭头函数 this指向的区别以及对UI刷新的影响

    鸿蒙Next开发-普通函数和箭头函数 this指向的区别以及对UI刷新的影响

    2025年02月26日 23点14分
  • 深入探索ArkUI @Builder与@BuilderParam的进阶应用

    在ArkUI的组件化开发体系中,@Builder和@BuilderParam这对装饰器组合扮演着UI模块化的重要角色。二者的差异与配合体现了声明式UI的核心思想:

    2025年02月26日 23点12分
  • Deepseek推荐:Android 开发者需要掌握的系统知识大纲

    一、操作系统基础1. Linux 内核机制内容介绍 Android 基于 Linux 内核,核心机制包括进程管理、内存管理、文件系统、Binder 驱动等。

    2025年02月26日 23点09分
  • Android App 厂商角标适配

    本篇介绍一下笔者在维护IM应用时,设置App角标的相关经验。同时这里设置角标都是基于系统厂商的Launcher,没有适配三方的Launcher应用,因为我们统计下来发现近些年使用三方Launcher应用比较少了,大部分用户还是以系统Launcher为主。所在在我们的项目中,主要是适配各个厂商。

    2025年02月26日 23点07分
  • 鸿蒙Next-方法装饰器以及防抖方法注解实现

    以下是关于 鸿蒙Next(HarmonyOS NEXT)中 MethodDecorator 的详细介绍及使用指南,结合了多个技术来源的实践总结:

    2025年02月26日 22点58分
  • DevEco Studio常用快捷键以及如何跟AndroidStudio的保持同步

    DevEco Studio是华为推出的用于开发HarmonyOS应用的集成开发环境,它提供了丰富的快捷键以提高开发效率,以下为你详细介绍不同操作场景下的常用快捷键:

    2025年02月26日 22点56分
  • Android | 利用ItemDecoration绘制RecyclerView分割线

    RecyclerView.ItemDecoration 是 Android 提供的一种扩展机制,用于为 RecyclerView 的每个子项(Item)添加装饰(Decoration)。它通常用于绘制分割线、边距、背景等,目的是增强 RecyclerView 的显示效果。

    2025年02月26日 22点52分
  • Android 布局优化:利用 ViewStub 和 Merge 提升性能

    提升界面渲染性能是一个至关重要的任务,尤其是在应用启动时,渲染界面需要快速且流畅。为了优化 UI 渲染速度,Android 提供了许多工具,其中 ViewStub 和 Merge 标签是非常有效的布局优化手段。通过合理使用这两者,可以延迟加载不必要的视图、减少布局的嵌套层级,从而加速应用的启动和运行。

    2025年02月26日 22点47分
  • 玩转 ImageView.ScaleType:图片的缩放与裁剪技巧

    ImageView 是最常用的控件之一,它用于展示各种类型的图片。为了能够根据需求调整图片的显示效果,Android 提供了 ImageView.ScaleType 枚举,它可以灵活地控制图片如何适应 ImageView 的尺寸。本文将探讨 ImageView.ScaleType 的不同选项、使用场景及其实现技巧。

    2025年02月26日 22点45分

发表回复

评论列表

点击查看更多

    联系我们

    在线咨询: QQ交谈

    微信:dxmcpjl

    邮件:1529097251#qq.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    微信