DBFlow使你的数据迁移变得异常简单

当你升级数据库@Database版本,只需要添加一个Migration来配置升级操作。

默认的Migration操作会自动载入/assets/migrations/{DatabaseName}/{versionName.sql}文件进行数据库升级。

如果你想要在第一次创建时对数据库进行初始化操作,只需要使用版本号 0

NOTE:如果你使用任意一个Migration子类比如AlterTableMigrationUpdateTableMigrationIndexMigration,你都应该只重写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));
    }
}