背景:之前用户表只有手势密码字段patternpassword,字段不空表面开启了手势密码。现在新增一个指纹登录,手势密码登录和指纹登录不能同时开启,关闭手势密码的同时还需保留之前的手势密码。所以新增2个字段是否开启手势gesture,1开启,0或者null不开启,是否开启指纹登录finger。
开始忽略的点是之前开启的,这次升级之后也应该开启。其实有点类似数据迁移。
先在SQLiteStudio测试了一下:
--select * from tb_accoUserInfo where patternpassword is not null and patternpassword != ''
update tb_accoUserInfo set gesture = 2 where patternpassword is not null and patternpassword != ''
具体到代码:
/** * 数据库更新的时候 */
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//从低版本依次升级
switch (oldVersion) {
case 8:
updateToVersion9(db);
case 9:
updateToVersion10(db);
case 10:
updateToVersion11(db);
break;
default:
TableHelper.dropTablesByClasses(db, this.modelClasses);
onCreate(db);
break;
}
}
/*
* 从8到9
*/
private void updateToVersion9(SQLiteDatabase db) {
L.i("updating from 8 to 9");
String sql1 = "ALTER TABLE " + "\'" + C.field.TB_AccoUserInfo + "\'" + " ADD " + "\'"+ C.field.TAUI_gesture +"\' TEXT default null";
String sql2 = "ALTER TABLE " + "\'" + C.field.TB_AccoUserInfo + "\'" + " ADD " + "\'" + C.field.TAUI_finger + "\' TEXT default null";
//之前开启的手势密码的应该也默认开启
String sqlGesture = "UPDATE "+ "\'" + C.field.TB_AccoUserInfo + "\'" +" SET " + "\'" +C.field.TAUI_gesture + "\'" + " = 1 WHERE " + "\'" +C.field.TAUI_patternpassword + "\'" +" is not null AND " + "\'" +C.field.TAUI_patternpassword + "\'" + " != ''";
try {
db.beginTransaction();
db.execSQL(sql1);
db.execSQL(sql2);
db.execSQL(sqlGesture);
db.setTransactionSuccessful();
L.i("updating to 7 is successful...");
} catch (SQLException e) {
L.e("updating to 7 is failed...");
e.printStackTrace();
} finally {
db.endTransaction();
}
}
其中有点奇怪是的,在sqlitestudio update能正确过滤条件,只是更新符合的部分。但是在真机测试时全部都设置了gesture = 1,及patternpassword空。
不过不影响功能,新代码中判断"1".equals(gesture) && patternpassword不空才认为开启了手势密码。