关闭

Android 数据库升级 简单应用二

标签: android数据库
81人阅读 评论(0) 收藏 举报
分类:
这是我们在使用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.     }  
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14063次
    • 积分:1011
    • 等级:
    • 排名:千里之外
    • 原创:88篇
    • 转载:15篇
    • 译文:0篇
    • 评论:1条
    文章分类