关闭

Android 数据库升级 简单应用二

标签: android数据库
127人阅读 评论(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网站的观点或立场

Android 数据库升级完整解决方案

原文  http://flyingcat2013.blog.51cto.com/7061638/1537074 数据库升级的意义 我们在开发Android应用的时候,不可避免地...
  • qq_35114086
  • qq_35114086
  • 2016-11-24 12:55
  • 1364

Android 数据库升级解决方案

请考虑如下情况: 在数据库升级时,不同版本的数据库,他们定义的表结构完全可能是不一样的,比如V1.0的表A有10个column,而在V1.1的表A有12个colum,在升级时,表A增加了两列,此时我...
  • leehong2005
  • leehong2005
  • 2013-06-19 14:33
  • 27732

android数据库版本更新的实现

概述当app升级时,不可避免的数据库可能会有所改变。比如新增一张表、改变某张表中的字段名、添加一个新的字段等一系列表结构的改变。按照现在来说,解决的方法只有两个: 1. 卸载当前版本,安装最新版的;...
  • u010137760
  • u010137760
  • 2016-08-25 10:50
  • 1187

简单的android应用升级、更新源代码

  • 2013-09-20 07:43
  • 7.07MB
  • 下载

Android APK 数据库升级简单例子

做Android APK应用的时候要经常和数据库打交道。在伴随着APK升级的过程中数据库可能也会有变化也要升级,我们要保证用户之前数据不流失。所以SQLite提供了数据库升级来解决这个问题。
  • wuyuxing24
  • wuyuxing24
  • 2015-07-28 14:11
  • 2422

Android 应用数据库升级

应用的更新有两种情况,一是系统应用随着系统OTA更新,二是用户从市场上单独更新app。无论哪种情况,若是前后版本的应用的数据库结构发生了变化,应用需要自行处理前后结构的转换工作。否则,更新后的应用访问...
  • miaotao
  • miaotao
  • 2015-04-19 15:58
  • 835

升级Android应用程序的思路-对数据库的操作(保留数据)

覆盖安装的时候,先读取联系人列表的数据,然后再安装。 Android应用升级的时候,不免对数据库做了很多的改动,比如增加或者删除字段,还有数据库版本的增大等,那么之前的数据是如何保存的呢? 我有两...
  • song_shi_chao
  • song_shi_chao
  • 2013-03-13 17:17
  • 2231

从ndk的安装到Android的apk增量升级(1)jni的简单应用

想要学习jni的调用先要理解他的原理,在这里我就不写了,在网上搜一下都能找到详尽的文章。 本文只是围绕网上的一篇博客进行解释和补充,主要是我自己在再次接触的时候遇到的问题,之前也做过一些但是时间一长...
  • gongxiaoou
  • gongxiaoou
  • 2016-06-28 10:39
  • 189

简单的Android数据库应用

  • 2017-01-17 09:54
  • 2.51MB
  • 下载

android数据库升级(二)

除了采用对比版本的方法升级数据库外,还可以直接将数据库复制到databases中,替换原有的,完成升级,以下是个简单的demo package com.example.copydatabase; ...
  • taishanduba
  • taishanduba
  • 2014-03-22 13:08
  • 429
    个人资料
    • 访问:25715次
    • 积分:1290
    • 等级:
    • 排名:千里之外
    • 原创:103篇
    • 转载:18篇
    • 译文:0篇
    • 评论:2条