我正在尝试将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'");
}
};
但它不起作用,这里有什么问题吗?
发布于 2022-03-22 05:03:15
最有可能的问题是(发布堆栈跟踪以帮助未来的读者),您的DB将无法执行2->3和3->4的迁移。
因此,只有当db从2直接升级到4时,您的代码才能工作;如果db从2升级到3或从3升级到4,则会抛出一个异常(这表示缺少什么迁移)。
最佳实践是创建单独的迁移--2到3,3到4。
空间将知道如何执行正确的迁移,并以正确的顺序执行(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'");
}
};
不要忘记更新DB版本:)
发布于 2022-03-22 04:58:01
恕我直言,你采取了一种保守的态度。
由于Room数据库使用Gradle设置版本号,因此更改它非常容易。
因此,不要依赖Gradle和SQLiteDatabase的工具为您完成这项工作,而是使用内存中的数据库版本,只需使用普通SQL创建列。
https://stackoverflow.com/questions/71567067
复制相似问题