Android — Room 数据库跳跃式升级(Migration)

前言

在平时的开发时,数据库的升级并不总是按部就班的从 version: 1->2,2->3,3->4。总是会出现 version:1->3,或 2->4 的情况。这时候我们又该怎么办呢?

方法很简单。当用户升级 APP 时,我们替用户升级数据库版本。

具体做法: version:1->2

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        //do something
    }
};

version:2->3

static final Migration MIGRATION_2_3 = new Migration(2, 3) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE student "
                + " ADD COLUMN phone_num TEXT");
    }
};

把migration 添加到 Room database builder:

database = Room.databaseBuilder(context.getApplicationContext(),
        StudentDatabase.class, "Demo.db")
        .addMigrations(MIGRATION_1_2, MIGRATION_2_3)
        .build();

复杂表操作:

字段类型修改

version:3->4

static final Migration MIGRATION_3_4 = new Migration(3, 4) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        //创建表
        database.execSQL(
                "CREATE TABLE student_new (student_id TEXT, student_name TEXT, phone_num INTEGER, PRIMARY KEY(student_id))");
        //复制表
        database.execSQL(
                "INSERT INTO student_new (student_id, student_name, phone_num) SELECT student_id, student_name, phone_num FROM student");
        //删除表
        database.execSQL("DROP TABLE student");
        //修改表名称
        database.execSQL("ALTER TABLE student_new RENAME TO students");
    }
};

多版本迁移

要是用户刚下载的 APP,想升级到版本最新版本呢?目前我们定义了migrations:version 1 到 2, version 2 到 3, version 3 到 4, 所以 Room 会一个接一个的触发所有 migration

其实 Room 可以处理大于 1 的版本增量:我们可以一次性定义一个从1 到4 的 migration,提升迁移的速度。

static final Migration MIGRATION_1_4 = new Migration(1, 4) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        //创建表
        database.execSQL(
                "CREATE TABLE student_new (student_id TEXT, student_name TEXT, phone_num INTEGER, PRIMARY KEY(student_id))");
        //复制表
        database.execSQL(
                "INSERT INTO student_new (student_id, student_name, phone_num) SELECT student_id, student_name, phone_num FROM student");
        //删除表
        database.execSQL("DROP TABLE student");
        //修改表名称
        database.execSQL("ALTER TABLE student_new RENAME TO students");
    }
};

接着,我们只需把它添加到 migration 列表中:

database = Room.databaseBuilder(context.getApplicationContext(),
        StudentDatabase.class, "Demo.db")
        .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_1_4)
        .build();

到这里版本升级结束了。

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1uwh50gnicplg

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android Note

Android—Room 数据库迁移(Migration)

1441
来自专栏c#开发者

Ext.net RecordField SubmitEmptyValue invalid 无效问题有解决方案吗

<ext:Store              ID="Store1"              runat="server"              Aut...

3355
来自专栏张戈的专栏

常用MySQL语句搜集整理

折腾 WordPress 多少要接触到 MySQL 的一些操作,比如,玛思阁之前重装 postview 插件后发现所有的 view 数据都被清空了!只好到 ph...

3735
来自专栏有趣的django

13.MySQL(一) 数据库简介mysql安装数据库操作Mysql数据类型存储引擎

数据库简介 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库 RDBMS 即关系数据库管理系统(Relational Database Ma...

3116
来自专栏Hadoop实操

Hive与Impala的关键字

Hive有一些保留的关键字,我们在执行一些语句时,不能将这些关键字作为标识符(Identifier),比如建表语句的表名或者字段名,以下我们具体看看什么是Hiv...

4004
来自专栏大数据-Hadoop、Spark

Hive的安装与使用-1

1.下载tar包,在客户端窗口上执行 wget -c http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cd...

3127
来自专栏维C果糖

史上最简单的 MySQL 教程(十六)「列属性 之 唯一键」

唯一键:每张表往往有多个字段需要具有唯一性,数据不能重复,但是在每张表中,只能有一个主键,因此唯一键就是用来解决表中多个字段需要具有唯一性的问题。

3285
来自专栏数据处理

Delete Duplicate Emails

1544
来自专栏DeveWork

移除除管理员之外的其他用户的WordPress 更新升级提示

对于多用户博客,一般只有一个管理员。维护后台等之类的工作一般都是管理员来做的,对于WordPress的更新升级,为了避免某些情况,可以通过以下代码实现除管理员之...

1779
来自专栏乐沙弥的世界

RMAN 数据库克隆文件位置转换方法

      在使用RMAN克隆数据库时,如果辅助数据库(新数据库)使用了与目标数据库(原数据库)使用了不同的路径,那么就存在位置转换的问题。在Oracle中,控...

581

扫码关注云+社区