Room数据库版本升级,数据迁移详解

一、背景介绍

使用SQLite API执行数据库迁移总有一种是在拆弹的感觉-仿佛一不小心就会让app在用户手中爆炸。如果你使用Room来处理数据库的操作,那么迁移就非常简单了。
使用Room的时候,如果你改变了数据库的schema但是没有更新version,app将会crash。而如果你更新了version但是没有提供迁移,数据库的表就会drop掉,用户将丢失数据。

二、数据库迁移背后的原理

QLite数据库处理schema的改变是在database version的帮助下完成的。更准确的说,每当你添加,删除,或者修改表导致schema变化的时候,你都必须增加数据库的版本号并更新SQLiteOpenHelper.onUpgrade方法。当你从旧版本到新版本的时候,是它告诉SQLite该做什么。
它也是app开始和数据库工作是所触发的第一个调用。SQLite将首先处理版本的升级,然后才打开数据库。
Room做了什么
Room以 Migration 类的形式提供可一个简化SQLite迁移的抽象层。Migration提供了从一个版本到另一个版本迁移的时候应该执行的操作。Room使用它自己实现的SQLiteOpenHelper,并在onUpgrade方法中触发你定义的迁移步骤。
这里是第一次获取数据库时将发生的事情:

  1. Room数据库被创建
  2. SQLiteOpenHelper.onUpgrade 方法被调用,然后Room触发迁移
  3. 数据库被打开
    如果你增加了数据库版本但是没有提供迁移,那么你的app可能会崩溃,数据可能会丢失,具体清空见下面的讨论。
    identity hash字符串在migration内部扮演者重要的角色,它用来对数据库版本进行唯一标识。当前版本的identity hash被保存在一个由Room管理的配置表中。因此如果你在数据库中看到一个room_master_table表不要感到奇怪。

三、多版本迁移

要是你的用户有一个运行版本号为1的app,想升级到版本4呢?目前位置我们定义了这些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) {
            // Create the new table
            database.execSQL(
                    "CREATE TABLE users_new (userid TEXT, username TEXT, last_update INTEGER, PRIMARY KEY(userid))");
            
            // Copy the data
            database.execSQL(
                    "INSERT INTO users_new (userid, username, last_update) SELECT userid, username, last_update FROM users");
    // Remove the old table
            database.execSQL("DROP TABLE users");
    // Change the table name to the correct one
            database.execSQL("ALTER TABLE users_new RENAME TO users");
        }
    };

然后,我们只需把它添加到migration列表中:

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

其它数据库迁徙到room参考
https://blog.csdn.net/yonghuming_jesse/article/details/98037118

你可能感兴趣的:(Room数据库版本升级,数据迁移详解)