Android 从版本 2 到 4 的房间迁移?

Android Room Migration from version 2 - 4?

我正在尝试将 Room 数据库从版本 2 和 3 迁移到版本 4,如下所示:

private static final Migration MIGRATION_2_4 = new Migration(2, 4) {
    @Override
    public void migrate(@NonNull @NotNull SupportSQLiteDatabase database) {

        database.execSQL(
                "ALTER TABLE 'market_data' ADD COLUMN 'watch_list_boolean' TEXT NOT NULL DEFAULT '0'");

        database.execSQL("DROP TABLE 'developer_data'");
    }
};

但它不起作用,这里有什么问题?

恕我直言,您的做法比较保守。

由于 Room 数据库使用 Gradle 设置其版本号,因此更改它非常容易。

因此,不要依赖 Gradle 和 SQLiteDatabase 的工具来为您完成这项工作,而是使用您的数据库的 in-memory 版本并使用创建列普通 SQL.

问题很可能(post 您的堆栈跟踪以帮助未来的读者)是您的数据库将无法执行迁移 2->3 和 3->4

因此,只有当您的数据库从 2 直接升级到 4 时,您的代码才会起作用,并且如果数据库从 2 升级到 3 或从3 到 4.

最佳做法是创建单独的迁移 - 2 到 3,以及 3 到 4。

Room 将知道以正确的顺序执行正确的迁移(2->3 或 3->4 或 2->3->4):

private static final Migration MIGRATION_2_3 = new Migration(2, 3) {
    @Override
    public void migrate(@NonNull @NotNull SupportSQLiteDatabase database) {
        database.execSQL(
                "ALTER TABLE 'market_data' ADD COLUMN 'watch_list_boolean' TEXT NOT NULL DEFAULT '0'");
    }
};

private static final Migration MIGRATION_3_4 = new Migration(3, 4) {
    @Override
    public void migrate(@NonNull @NotNull SupportSQLiteDatabase database) {
        database.execSQL("DROP TABLE 'developer_data'");
    }
};

不要忘记更新数据库版本:)