项目用的是dbflow。不过应该都是大同小异。针对于数据库的话,比如v1新增了一个字符串test1,v2新增了test2,v3新增了test3。如果用户每个版本都进行升级的话,就不会出现问题。但是如果有些用户,是跨版本升级的,比如直接从v1升级到了v3。如果不做处理的话,就会变成已经升级到了v3,但是并没有test2这个字符串。导致程序出现问题。直接上代码
public class MyFlowSQliteOpenHelperextends FlowSQLiteOpenHelper {
public MyFlowSQliteOpenHelper(DatabaseDefinition databaseDefinition, DatabaseHelperListener listener) {
super(databaseDefinition, listener);
}
@Override
public void onUpgrade(@NonNull SQLiteDatabase db, int oldVersion, int newVersion) {
// super.onUpgrade(db, oldVersion, newVersion);
switch (oldVersion) {
case 1:
super.onUpgrade(db, 1, 2);
Log.d("20201218", "case 1:");
case 2:
super.onUpgrade(db, 2, 3);
Log.d("20201218", "case 2:");
case 3:
super.onUpgrade(db, 3, 4);
Log.d("20201218", "case 3:");
case 4:
super.onUpgrade(db, 4, 5);
Log.d("20201218", "case 4:");
case 5:
super.onUpgrade(db, 5, 6);
Log.d("20201218", "case 5:");
case 6:
super.onUpgrade(db, 6, 7);
Log.d("20201218", "case 6:");
break;
}
}
}
就是直接重写SQLiteOpenHelper。在onUpgrade方法里面判断当前版本。上面代码里,最新的版本是7。如果当前版本是1的话,就会运行1升级到2,2升级到3,3升级到4,一直升级到7。因为switch case里面,如果case里面的代码没有加上break的话,就会一直运行下去,直到遇到break。重写完这个方法之后,在init的时候修改一下初始化的参数就可以了
//初始化DBFlow
FlowManager.init(
new FlowConfig.Builder(this)
.addDatabaseConfig(DatabaseConfig.builder(AppDataBase.class).openHelper(new DatabaseConfig.OpenHelperCreator() {
@Override
public OpenHelpercreateHelper(DatabaseDefinition databaseDefinition, DatabaseHelperListener helperListener) {
return new MyFlowSQliteOpenHelper(databaseDefinition,helperListener);
}
})
.databaseName("test")
.build())
.build());
网友评论