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都达到理想状态,那么就需要在升级的过程中,做到逐级升级。否则,如果在某个数据库版本的跟新操作中执行了数据定义语言,跳过这个版本,后面势必会出现问题。

相关代码

  

Android数据库升级

Android数据库升级

1 /** 2 * 将数据库逐级更新到指定版本 3 * @param db 需要更细的数据库 4 * @param dbVer 目标版本号 5 * @author Haibo.Wu 6 * @Date 2015-10-15 7 */ 8 private void doUpdate(SQLiteDatabase db, int dbVer){ 9 // 数据库逐级更新 10 for (int ver = 1; ver <= dbVer; ver++) { 11 switch (ver) { 12 /* case 1: 13 case 2: 14 case 3: 15 case 4: 16 case 5: 17 case 6: 18 case 7: 19 case 8: 20 break;*/ 21 case 9: 22 updateDB2V9(db); 23 break; 24 25 default: 26 break; 27 } 28 } 29 } 30 31 /** 32 * 将数据库逐级更新到指定版本 33 * @param db 需要更新的数据库 34 * @param oldVersion 旧的数据库版本号 35 * @param newVersion 数据库目标版本号 36 * @author Haibo.Wu 37 * @Date 2015-10-15 38 */ 39 private void doUpdate(SQLiteDatabase db, int oldVersion, int newVersion){ 40 if(oldVersion >= 1 && newVersion > 2) { 41 //数据库逐级更新 42 for(int i=oldVersion; i<=newVersion; i++){ 43 switch (i) { 44 case 8: 45 updateDB2V8(); 46 break; 47 case 9: 48 updateDB2V9(db); 49 break; 50 51 default: 52 break; 53 } 54 } 55 } 56 } 57 58 /** 59 * 升级数据库到版本8 60 * @author Haibo.Wu 61 * @Date 2015-10-15 62 */ 63 public void updateDB2V8() { 64 System.out.println("DataBaseHelper.updateDB2V8()--升级数据库到版本8"); 65 new Thread(new Runnable() { 66 67 @Override 68 public void run() { 69 changeDBFile(); 70 } 71 }).start(); 72 } 73 74 75 /** 76 * 升级数据库到版本9 77 * @author Haibo.Wu 78 * @Date 2015-10-14 79 */ 80 public void updateDB2V9(final SQLiteDatabase db) { 81 System.out.println("DataBaseHelper.updateDB2V9()--升级数据库到版本9"); 82 // TODO Auto-generated method stub 83 final ArrayList<String> sqlList = new ArrayList<String>(); 84 sqlList.add("mt_brand_upd.sql"); 85 sqlList.add("mt_equip_code_upd.sql"); 86 sqlList.add("mt_equip_special_upd.sql"); 87 sqlList.add("mt_equip_value_upd.sql"); 88 sqlList.add("mt_family_upd.sql"); 89 sqlList.add("mt_maker_brand_upd.sql"); 90 sqlList.add("mt_style_upd.sql"); 91 sqlList.add("mt_vehicle_upd.sql"); 92 93 db.beginTransaction(); 94 try { 95 new Thread(new Runnable() { 96 String schemaName = null; 97 98 @Override 99 public void run() { 100 for(String sqlFileName : sqlList){ 101 executeAssetsSQL(db, sqlFileName); 102 } 103 } 104 }).start(); 105 } catch (Exception e) { 106 // TODO: handle exception 107 } 108 db.endTransaction(); 109 } 110 111 /** 112 * 读取数据库文件(.sql),并执行sql语句 113 * @author Haibo.Wu 114 * @Date 2015-10-14 115 * */ 116 private void executeAssetsSQL(SQLiteDatabase db, String schemaName) { 117 BufferedReader in = null; 118 String path = "db_v9"; 119 try { 120 InputStreamReader inReader = new InputStreamReader(context.getAssets().open(path + "http://www.likecs.com/" + schemaName)); 121 in = new BufferedReader(inReader); 122 123 //System.out.println("路径:" + Configuration.DB_PATH + "http://www.likecs.com/" + schemaName); 124 String line = null; 125 String buffer = null; 126 while ((line = in.readLine()) != null) { 127 buffer = line; 128 // System.out.println("DataBaseHelper.executeAssetsSQL()--sql语句:"+buffer); 129 /*if (line.trim().endsWith(";")) { 130 // db.execSQL(buffer); 131 // db.execSQL(buffer.replace(";", "")); 132 buffer = ""; 133 }*/ 134 db.execSQL(buffer); 135 System.out.println("DataBaseHelper.executeAssetsSQL()--sql语句:"+buffer); 136 buffer = null; 137 } 138 } catch (IOException e) { 139 Log.e("db-error", e.toString()); 140 } finally { 141 try { 142 if (in != null) 143 in.close(); 144 } catch (IOException e) { 145 Log.e("db-error", e.toString()); 146 } 147 } 148 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzwjjy.html