前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android — Room 数据库跳跃式升级(Migration)

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

作者头像
code_horse
发布2018-07-02 15:15:21
2.2K0
发布2018-07-02 15:15:21
举报
文章被收录于专栏:Android Note

前言

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

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

具体做法: version:1->2

代码语言:javascript
复制
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        //do something
    }
};

version:2->3

代码语言:javascript
复制
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:

代码语言:javascript
复制
database = Room.databaseBuilder(context.getApplicationContext(),
        StudentDatabase.class, "Demo.db")
        .addMigrations(MIGRATION_1_2, MIGRATION_2_3)
        .build();

复杂表操作:

字段类型修改

version:3->4

代码语言:javascript
复制
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,提升迁移的速度。

代码语言:javascript
复制
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 列表中:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.05.23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档