DBFlow使你的数据迁移变得异常简单
当你升级数据库@Database
版本,只需要添加一个Migration
来配置升级操作。
默认的Migration
操作会自动载入/assets/migrations/{DatabaseName}/{versionName.sql}
文件进行数据库升级。
如果你想要在第一次创建时对数据库进行初始化操作,只需要使用版本号 0!
NOTE:如果你使用任意一个Migration子类比如AlterTableMigration
、UpdateTableMigration
或IndexMigration
,你都应该只重写onPreMigrate()
方法,并且在其中调用super.onPreMigrate()
,里面需要进行一些必要的实例化操作。
NOTE:所有的Migration
都应该只有一个公共无参构造函数。
Migration类
作为一个基本的类,BaseMigration
是一个非常简单的类,让你定义自己的迁移操作:
@Migration(version = 2, database = AppDatabase.class)
public class Migration1 extends BaseMigration {
@Override
public void migrate(DatabaseWrapper database) {
}
}
添加列
这里举一个简单的例子,我们需要向已有的数据表中添加一个列。
这里是原来数据表的类:
@Table
public class TestModel extends BaseModel {
@Column
@PrimaryKey
String name;
@Column
int randomNumber;
}
现在我们想要向这个数据表里面添加一列,这里有两种方式:
- 写SQL语句
ALTER TABLE TestModel ADD COLUMN timestamp INTEGER;
到文件{dbVersion.sql}
,并放到assets的指定目录中,DBFlow将会自动执行。 使用
Migration
类:@Migration(version = 2, database = AppDatabase.class) public class Migration1 extends AlterTableMigration<TestModel> { @Override public void onPreMigrate() { // Simple ALTER TABLE migration wraps the statements into a nice builder notation addColumn(Long.class, "timestamp"); } }
升级列
@Migration(version = 2, database = AppDatabase.class)
public class Migration1 extends UpdateTableMigration<TestModel> {
@Override
public void onPreMigrate() {
// UPDATE TestModel SET deviceType = "phablet" WHERE screenSize > 5.7 AND screenSize < 7;
set(TestModel_Table.deviceType.is("phablet"))
.where(TestModel_Table.screenSize.greaterThan(5.7), TestModel_Table.screenSize.lessThan(7));
}
}