数据库升级案例-用户表

424 阅读1分钟

背景:之前用户表只有手势密码字段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不空才认为开启了手势密码。