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'");
}
};
不要忘记更新数据库版本:)
我正在尝试将 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'");
}
};
不要忘记更新数据库版本:)