首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化房间数据库迁移

优化房间数据库迁移
EN

Stack Overflow用户
提问于 2022-09-03 16:47:02
回答 1查看 38关注 0票数 2

在迁移(3,4)中,我删除了表TableA并创建了两个新表TableB和` `TableC。

代码语言:javascript
复制
static final Migration MIGRATION_3_4 = new Migration(3, 4) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("DROP TABLE IF EXISTS `TableA`");

        database.execSQL("CREATE TABLE IF NOT EXISTS " +
                "`TableB` (`id` INTEGER NOT NULL, " +
                "PRIMARY KEY(`id`))");

        database.execSQL("CREATE TABLE IF NOT EXISTS " +
                "`TableB` (`id` INTEGER NOT NULL, " +
                "PRIMARY KEY(`id`))");

        // bulky method
        databaseWriteExecutor.execute(AppDatabase::populateProblem);
    }
};

在迁移(4,5)中,我希望删除TableB和TableC:

代码语言:javascript
复制
static final Migration MIGRATION_4_5 = new Migration(4, 5) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("DROP TABLE IF EXISTS `TableB`");
        database.execSQL("DROP TABLE IF EXISTS `TableC`");
    }
};

如您所见,迁移(4,5)与迁移(3,4)相反。现在假设用户希望从3迁移到5,据我所知,Room将连续运行两次迁移--在本例中是3到4,然后是4到5,创建两个表,然后删除它们是浪费时间,所以为了优化这个过程,我添加了一个新的迁移(3,5):

代码语言:javascript
复制
static final Migration MIGRATION_3_5 = new Migration(3, 5) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("DROP TABLE IF EXISTS `TableA`");
    }
};

问题:我能安全地从源代码中删除迁移(3,4)吗?因为我认为它不再被使用了。在这个迁移中,我调用populateProblem()方法,这是一个非常大的方法,删除迁移将减少apk的大小。

EN

Stack Overflow用户

回答已采纳

发布于 2022-09-03 17:22:18

是的,你可以放弃中间迁移。您只需要保持从以前的每个版本到最新版本的迁移。因此,如果您的最新DB版本是5,并且假设生产中有版本1-4,则只需要进行以下迁移:

代码语言:javascript
复制
Migration(1, 5)
Migration(2, 5)
Migration(3, 5)
Migration(4, 5)
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73593929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档