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

相关代码

  

  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 + "/" + schemaName));
121             in = new BufferedReader(inReader);
122  
123             //System.out.println("路径:" + Configuration.DB_PATH + "/" + 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     }
View Code

 

posted @ 2015-10-15 10:56  ithaibo  阅读(228)  评论(0)    收藏  举报
请留下你的高见