这是一个相当复杂的问题,但基本上你有两种策略:
fallbackToDestructiveMigration
-> 实现简单,但应用程序更新后用户将失去他们的数据
- 提供
Migration
策略(优选)
方案1 - fallbackToDestructiveMigration
在数据库初始化时,在数据库构建器上简单调用fallbackToDestructiveMigration
:
database = Room.databaseBuilder(context.getApplicationContext(),
UsersDatabase.class, "Sample.db")
.fallbackToDestructiveMigration()
.build();
在这种情况下,由于您已更新数据库版本(假设从版本1升级到版本2),Room找不到任何迁移策略,因此它将回退到破坏性迁移,表将被删除。
第二种情况 - 智能迁移
假设您有一个名为“用户”的表,并且在数据库的第2个版本中添加了一个列。让我们称这个列为“user_score”。您应该实现Migration类的migrate接口,以便将您的“Users version 1”模式更新为“Users version 2”模式。为此,您需要一个alter table语句,可以直接在migrate方法中编写。
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE Users ADD COLUMN user_score INTEGER")
}
};
database = Room.databaseBuilder(context.getApplicationContext(),
UsersDatabase.class, "Sample.db")
.addMigrations(MIGRATION_1_2)
.build();
更多参考资料在这里: