在android中有时候需要对本地数据库做升级,通常做的方案大概是这样子的:
A: onUpgrade方法中,根据当前的oldVersion和newVerson,判断我们需要在哪些版本后开始升级,若不在设定的升级版本之前,则不做处理否则进行升级处理
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 8版本之前,按照原代码处理 if (oldVersion < 8) { upgradeDropDB(db, oldVersion, newVersion); return; } // SQLiteOpenHelper中已经添加事务,数据库更新不需要添加事务 // 根据oldVersion,循环升级,每次升级一个版本 while (oldVersion < newVersion) { upgradeDB(db, oldVersion, newVersion); oldVersion++; } }
B: 进行升级处理 【在制定版本之前删除以前所有的表】
private void upgradeDropDB(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 8) { db.execSQL("DROP TABLE IF EXISTS " + DBConstants.DB_TABLE.TABLE_PROVINCE); db.execSQL("DROP TABLE IF EXISTS " + DBConstants.DB_TABLE.TABLE_CITY); db.execSQL("DROP TABLE IF EXISTS " + DBConstants.DB_TABLE.TABLE_DISTRICT); db.execSQL("DROP TABLE IF EXISTS " + DBConstants.DB_TABLE.TABLE_STREET); db.execSQL("DROP TABLE IF EXISTS " + DBConstants.DB_TABLE.TABLE_MOBILE_PAYMENT_BROWSE); db.execSQL("DROP TABLE IF EXISTS " + DBConstants.DB_TABLE.TABLE_ADDRESS); db.execSQL("DROP TABLE IF EXISTS " + DBConstants.DB_TABLE.TABLE_USER_ACCOUNT); onCreate(db); }否则做升级
/* * 数据库升级方法:根据oldVersion,每次升级一个版本 */ private void upgradeDB(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 8: // 创建temp表 db.execSQL(DBConstants.CREATE_TEMP_TABLE_USER_ACCOUNT); // 创建新表 db.execSQL(DBConstants.CREATE_TABLE_USER_ACCOUNT_SQLITE); // 插入表数据 db.execSQL(DBConstants.INSERT_TABLE_USER_ACCOUNT_DATA); // 删除temp表 db.execSQL(DBConstants.DROP_TABLE_USER_ACCOUNT); break; default: break; } }
// 将现有数据表数据,名字进行变更 public static final String CREATE_TEMP_TABLE_USER_ACCOUNT = "alter table table_user_account rename to _temp_table_user_account"; // 添加数据 public static final String INSERT_TABLE_USER_ACCOUNT_DATA = "insert into table_user_account select *,'' from _temp_table_user_account"; // 删除掉中间表 public static final String DROP_TABLE_USER_ACCOUNT = "drop table _temp_table_user_account"; // 创建新表 public static final String CREATE_TABLE_USER_ACCOUNT_SQLITE = "create table if not exists " + DBConstants.DB_TABLE.TABLE_USER_ACCOUNT + "(_id integer primary key autoincrement," + DBConstants.USER_ACCOUNT.ACCOUNT_NAME + " text," + DBConstants.USER_ACCOUNT.LOGIN_TIME + " integer," + DBConstants.USER_ACCOUNT.ACCOUNT_PWD + " text," + DBConstants.USER_ACCOUNT.LOGIN_TYPE + " text" // + "," // + DBConstants.USER_ACCOUNT.REMEMBER_PWD + " integer" + ")";过程是这样子的:
1: 生成一个现有表的的临时表【主要用来存储现有表中的数据】
2: 创建一个与现有表同名的新表【里面会添加字段】
3:将临时表中的数据插入到新建的表中
4: 删除临时表即可