生成Android Room迁移的最佳方法是什么?

3
请注意,我来自于一个熟悉Entity Framework的.NET背景。
在EF迁移中,实际的迁移是为您生成的。基本上,您在POCO对象中指定要进行的更改。当您添加新的迁移时,它会对数据库和POCO对象之间的差异进行比较,并生成迁移脚本。您几乎不必查看它。
因此,使用Android Room时,我发现我需要手动创建这些迁移。而且,有一些规则意味着除非迁移您手动制作的方案完全符合Room基于POJO对象认为应该达到的状态,否则系统将崩溃。
对我来说,这似乎是一项繁琐而有风险的任务,可以自动化(就像EF迁移已经做的那样)。因此,我的问题是,是否有工具或其他东西可以自动执行这些迁移?如果没有,有哪些安全或高效地执行这些迁移的指导方针?
2个回答

3

我不确定目前是否有专门针对Room的此类工具,但我很怀疑会有,因为Room的稳定版本仅在几个月前发布。

你可以生成一些小的东西,如表创建的SQL语句。只需添加:

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

将以下内容翻译为中文:
完整模式的JSON生成到您的build.gradle中的android/defaultConfig中。要安全地执行这些迁移,您可以进行全面测试,具体操作可以参考此处描述。就效率而言,我建议创建直接迁移,如Migration(1, 4)

1
谢谢。JSON输出中的表创建语句非常有帮助。不要忘记在您的@Database注释中确保exportSchema = true(默认为true),否则将不会生成JSON文件。 - Tim Malseed

0

Android Room的迁移存在问题,因为即使列顺序不同也会显示迁移失败。但由于SQLite的限制,无法进行列类型更改等操作。请按照Michal的答案生成模式。

schema location

然后使用JSON diff 工具查看它如何生成您特定的表格。

如果差异很容易排除,在迁移脚本中执行必要的修改命令即可。我已经放弃这样做,而是创建一个新的表格,以我新版本期望的方式进行,并将数据从旧表格复制过来,然后删除它,并将正确创建的表格重命名。这是一些代码:

    static final Migration MIGRATION_3_4 = new Migration(3, 4) {
    @Override
    /**
     * Instead of trying to read the owl droppings of the error message, simply go to the schemas directory
     * and do a table copy of the before and after.  Look for the table creation in the updated schema number
     * then do an insert by doing a select * from the old
     * then remove the old and rename the new
     */
    public void migrate(SupportSQLiteDatabase _db) {
        _db.execSQL("CREATE TABLE IF NOT EXISTS crew2 (`crewId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `shortName` TEXT, `isCaptain` TEXT)");
        _db.execSQL("INSERT INTO crew2(crewid,name,shortname) SELECT * FROM crew_table");
        _db.execSQL("DROP TABLE crew_table");
        _db.execSQL("ALTER TABLE crew2 RENAME TO crew_table");
        _db.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `index_crew_table_shortName` ON `crew_table` (`shortName`)");

    }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接