Android数据库升级

时间:2023-03-09 04:11:02
Android数据库升级

随着Android应用版本的迭代,经常遇到数据库表结构发生改变,或者一些指定的表数据需要更新。这也就引出一个问题Android数据库的更新问题。

Android数据库升级分类

Android数据库更新大致情况可分为以下两种类型:

第一版APP版本号:appVersion = 1.0

第二版APP版本号:appNewVersion = 2.0

1. 用户A,使用了appVersion ,并在自动更新的基础上,升级到appNewVersion;

2. 用户B,没有使用过appVersion,而是直接安装的appNewVersion。

升级分类解析

  • 用户A,在自动更新时,执行的是SQLiteOpenHelper.onUpdate(SQLiteDatabase db, int oldVersion, int newVersion);
  • 用户B,在安装appNewVersion时,执行的是SQLliteOpenHelper.onCreate(SQLiteDatabase db), 并不会执行上文中的onUpdate方法;

因此,如果要保证直接安装最新版本的APP的情况下,数据库与更新APP后的数据库保持一致,那么就必须在onCreate()方法中加入数据库的相关跟新操作。

数据库逐级升级

由于APP的版本的迭代,为了保证数据库不论是在何种情况下使用最新版本的APP都达到理想状态,那么就需要在升级的过程中,做到逐级升级。否则,如果在某个数据库版本的跟新操作中执行了数据定义语言,跳过这个版本,后面势必会出现问题。

相关代码

  

 /**
* 将数据库逐级更新到指定版本
* @param db 需要更细的数据库
* @param dbVer 目标版本号
* @author Haibo.Wu
* @Date 2015-10-15
*/
private void doUpdate(SQLiteDatabase db, int dbVer){
// 数据库逐级更新
for (int ver = 1; ver <= dbVer; ver++) {
switch (ver) {
/* case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
break;*/
case 9:
updateDB2V9(db);
break; default:
break;
}
}
} /**
* 将数据库逐级更新到指定版本
* @param db 需要更新的数据库
* @param oldVersion 旧的数据库版本号
* @param newVersion 数据库目标版本号
* @author Haibo.Wu
* @Date 2015-10-15
*/
private void doUpdate(SQLiteDatabase db, int oldVersion, int newVersion){
if(oldVersion >= 1 && newVersion > 2) {
//数据库逐级更新
for(int i=oldVersion; i<=newVersion; i++){
switch (i) {
case 8:
updateDB2V8();
break;
case 9:
updateDB2V9(db);
break; default:
break;
}
}
}
} /**
* 升级数据库到版本8
* @author Haibo.Wu
* @Date 2015-10-15
*/
public void updateDB2V8() {
System.out.println("DataBaseHelper.updateDB2V8()--升级数据库到版本8");
new Thread(new Runnable() { @Override
public void run() {
changeDBFile();
}
}).start();
} /**
* 升级数据库到版本9
* @author Haibo.Wu
* @Date 2015-10-14
*/
public void updateDB2V9(final SQLiteDatabase db) {
System.out.println("DataBaseHelper.updateDB2V9()--升级数据库到版本9");
// TODO Auto-generated method stub
final ArrayList<String> sqlList = new ArrayList<String>();
sqlList.add("mt_brand_upd.sql");
sqlList.add("mt_equip_code_upd.sql");
sqlList.add("mt_equip_special_upd.sql");
sqlList.add("mt_equip_value_upd.sql");
sqlList.add("mt_family_upd.sql");
sqlList.add("mt_maker_brand_upd.sql");
sqlList.add("mt_style_upd.sql");
sqlList.add("mt_vehicle_upd.sql"); db.beginTransaction();
try {
new Thread(new Runnable() {
String schemaName = null; @Override
public void run() {
for(String sqlFileName : sqlList){
executeAssetsSQL(db, sqlFileName);
}
}
}).start();
} catch (Exception e) {
// TODO: handle exception
}
db.endTransaction();
} /**
* 读取数据库文件(.sql),并执行sql语句
* @author Haibo.Wu
* @Date 2015-10-14
* */
private void executeAssetsSQL(SQLiteDatabase db, String schemaName) {
BufferedReader in = null;
String path = "db_v9";
try {
InputStreamReader inReader = new InputStreamReader(context.getAssets().open(path + "/" + schemaName));
in = new BufferedReader(inReader); //System.out.println("路径:" + Configuration.DB_PATH + "/" + schemaName);
String line = null;
String buffer = null;
while ((line = in.readLine()) != null) {
buffer = line;
// System.out.println("DataBaseHelper.executeAssetsSQL()--sql语句:"+buffer);
/*if (line.trim().endsWith(";")) {
// db.execSQL(buffer);
// db.execSQL(buffer.replace(";", ""));
buffer = "";
}*/
db.execSQL(buffer);
System.out.println("DataBaseHelper.executeAssetsSQL()--sql语句:"+buffer);
buffer = null;
}
} catch (IOException e) {
Log.e("db-error", e.toString());
} finally {
try {
if (in != null)
in.close();
} catch (IOException e) {
Log.e("db-error", e.toString());
}
}
}