Android 数据库升级 简单应用二

这是我们在使用SQLiteOpenHelper类时最常使用到的方法,用于打开一个可写的数据库,

[java]  view plain  copy
 print ?
  1. getDatabaseLocked(true)//参数true表示可写、false表示打开一个只读的数据库  
[java]  view plain  copy
 print ?
  1. getDatabaseLocked(true)中,下面就是关于版本更新的逻辑:(方法中的部分代码)  

[java]  view plain  copy
 print ?
  1. final int version = db.getVersion();//获取当前的版本  
  2.           if (version != mNewVersion) {//版本有变更  
  3.                 if (db.isReadOnly()) {//如果在一个只读的数据库中更新版本,会产生异常,这点要注意  
  4.                     throw new SQLiteException("Can't upgrade read-only database from version " +  
  5.                             db.getVersion() + " to " + mNewVersion + ": " + mName);  
  6.                 }  
  7.   
  8.                 db.beginTransaction();//开始事务  
  9.                 try {  
  10.                     if (version == 0) {//如果数据库不存在则创建  
  11.                         onCreate(db);  
  12.                     } else {  
  13.                         if (version > mNewVersion) {//新版本小于当前版本,也就是降版本时会执行这个方法,这个方法会抛出异常  
  14.                             onDowngrade(db, version, mNewVersion);  
  15.                         } else {  
  16.                             onUpgrade(db, version, mNewVersion);//更新版本,我们需要重写这个方法  
  17.                         }  
  18.                     }  
  19.                     db.setVersion(mNewVersion);  
  20.                     db.setTransactionSuccessful();  
  21.                 } finally {  
  22.                     db.endTransaction();  
  23.                 }  
  24.             }  
  25.   
  26.             onOpen(db);  
  27.   
  28.             if (db.isReadOnly()) {  
  29.                 Log.w(TAG, "Opened " + mName + " in read-only mode");  
  30.             }  
  31.   
  32.             mDatabase = db;  
  33.             return db;  


以上就是版本更新的逻辑,那我们应当如何去重写onUpgrade方法呢?四个步骤:

[java]  view plain  copy
 print ?
  1. <pre name="code" class="java">/** 
  2.      * 更新数据库版本,例如需要将user表的id、name、sex、age字段更新为user_id,user_name,user_sex,user_age 
  3.      */  
  4.     private void UpgradeV2(SQLiteDatabase db) {  
  5.         StringBuffer sb1 = new StringBuffer();  
  6.         //1将需要更新的user表重命名为temp_user  
  7.         sb1.append(" ALTER TABLE ");  
  8.         sb1.append("user");  
  9.         sb1.append(" RENAME TO ");  
  10.         sb1.append("temp_");  
  11.         sb1.append("user");  
  12.         db.execSQL(sb1.toString());  
  13.         //2   
  14.         db.execSQL("创建新的user表的SQL语句,表名为user");  
  15.         //3将旧表(temp_user)的数据复制到新表(user)  
  16.         StringBuilder sb3 = new StringBuilder();  
  17.         sb3.append("INSERT INTO ");  
  18.         sb3.append("user");  
  19.         sb3.append("(id,name.sex.age)");  
  20.         sb3.append(" SELECT ");  
  21.         sb3.append("user_id,user_name_user_sex,user_age");  
  22.         sb3.append(" FROM ");  
  23.         sb3.append("temp_user");  
  24.         db.execSQL(sb3.toString());  
  25.         //4删除临时表  
  26.         StringBuilder sb4 = new StringBuilder();  
  27.         sb4.append(" DROP TABLE ");  
  28.         sb4.append("temp_user"););  
  29.         db.execSQL(sb4.toString());  
  30.     }  



//更新版本完成之后才会去执行你的增删改查操作

 
还有需要注意的一个地方是,更新的时候应当使用是如下循环的方式更新,因为如果某个用户一直不下载更新你的APK,他的数据库版本是1,而你最新版APK的数据库版本已经到了5了,为了不出错,需要循环将他的数据库版本更新到2,再更新到3,再更新到4,再更新5,这样,你的增删改查才不会出错。如下代码: 

[java]  view plain  copy
 print ?
  1. @Override  
  2.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  3.         for (int i = oldVersion; i <= newVersion; i++) {  
  4.             switch (i) {  
  5.                 case 2:  
  6.                     UpgradeV2(db);  
  7.                     break;  
  8.                 case 3:  
  9.                     UpgradeV3(db);  
  10.                     break;  
  11.                 case 4:  
  12.                     UpgradeV4(db);  
  13.                     break;  
  14.             }  
  15.         }  
  16.     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值