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

相关代码

  

 /**
* 将数据库逐级更新到指定版本
* @param db 需要更细的数据库
* @param dbVer 目标版本号
* @author Haibo.Wu
* @Date 2015-10-15
*/
private void doUpdate(SQLiteDatabase db, int dbVer){
// 数据库逐级更新
for (int ver = 1; ver <= dbVer; ver++) {
switch (ver) {
/* case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
break;*/
case 9:
updateDB2V9(db);
break; default:
break;
}
}
} /**
* 将数据库逐级更新到指定版本
* @param db 需要更新的数据库
* @param oldVersion 旧的数据库版本号
* @param newVersion 数据库目标版本号
* @author Haibo.Wu
* @Date 2015-10-15
*/
private void doUpdate(SQLiteDatabase db, int oldVersion, int newVersion){
if(oldVersion >= 1 && newVersion > 2) {
//数据库逐级更新
for(int i=oldVersion; i<=newVersion; i++){
switch (i) {
case 8:
updateDB2V8();
break;
case 9:
updateDB2V9(db);
break; default:
break;
}
}
}
} /**
* 升级数据库到版本8
* @author Haibo.Wu
* @Date 2015-10-15
*/
public void updateDB2V8() {
System.out.println("DataBaseHelper.updateDB2V8()--升级数据库到版本8");
new Thread(new Runnable() { @Override
public void run() {
changeDBFile();
}
}).start();
} /**
* 升级数据库到版本9
* @author Haibo.Wu
* @Date 2015-10-14
*/
public void updateDB2V9(final SQLiteDatabase db) {
System.out.println("DataBaseHelper.updateDB2V9()--升级数据库到版本9");
// TODO Auto-generated method stub
final ArrayList<String> sqlList = new ArrayList<String>();
sqlList.add("mt_brand_upd.sql");
sqlList.add("mt_equip_code_upd.sql");
sqlList.add("mt_equip_special_upd.sql");
sqlList.add("mt_equip_value_upd.sql");
sqlList.add("mt_family_upd.sql");
sqlList.add("mt_maker_brand_upd.sql");
sqlList.add("mt_style_upd.sql");
sqlList.add("mt_vehicle_upd.sql"); db.beginTransaction();
try {
new Thread(new Runnable() {
String schemaName = null; @Override
public void run() {
for(String sqlFileName : sqlList){
executeAssetsSQL(db, sqlFileName);
}
}
}).start();
} catch (Exception e) {
// TODO: handle exception
}
db.endTransaction();
} /**
* 读取数据库文件(.sql),并执行sql语句
* @author Haibo.Wu
* @Date 2015-10-14
* */
private void executeAssetsSQL(SQLiteDatabase db, String schemaName) {
BufferedReader in = null;
String path = "db_v9";
try {
InputStreamReader inReader = new InputStreamReader(context.getAssets().open(path + "/" + schemaName));
in = new BufferedReader(inReader); //System.out.println("路径:" + Configuration.DB_PATH + "/" + schemaName);
String line = null;
String buffer = null;
while ((line = in.readLine()) != null) {
buffer = line;
// System.out.println("DataBaseHelper.executeAssetsSQL()--sql语句:"+buffer);
/*if (line.trim().endsWith(";")) {
// db.execSQL(buffer);
// db.execSQL(buffer.replace(";", ""));
buffer = "";
}*/
db.execSQL(buffer);
System.out.println("DataBaseHelper.executeAssetsSQL()--sql语句:"+buffer);
buffer = null;
}
} catch (IOException e) {
Log.e("db-error", e.toString());
} finally {
try {
if (in != null)
in.close();
} catch (IOException e) {
Log.e("db-error", e.toString());
}
}
}

Android数据库升级的更多相关文章

  1. 优雅的处理Android数据库升级的问题

    原始完成于:2015-04-27 19:28:22 提供一种思路,优雅的处理Android数据库升级的问题,直接上代码: 1 package com.example.databaseissuetest ...

  2. Android 数据库升级解决方案

    转自:http://blog.csdn.net/leehong2005/article/details/9128501 请考虑如下情况: 在数据库升级时,不同版本的数据库,他们定义的表结构完全可能是不 ...

  3. Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())[4]

    数据库版本升级对软件的管理操作. 我们手机经常会收到xxx软件升级什么的提醒,你的软件版本更新,同时你的数据库对应的版本也要相应的更新. 数据库版本更新需要主要的问题: 软件的1.0版本升级到1.1版 ...

  4. Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())的注意点

    以下内容可以作为面试官在面试的时候的问题,感觉比较好,是比较常用的知识点,可以用来考察基础是否扎实. 也可以程序猿学习.开发中的注意点.因为稍微不注意,就有可能导致数据库不能用. DBAdapter. ...

  5. Android数据库升级不丢失数据解决方案

    在Android开发中,sqlite至关重要,增删查改不多说,难点在于,1,并发,多个线程同时操作数据库.2,版本升级时,如果数据库表中新加了个字段,如何在不删除表的情况下顺利过渡,从而不丢失数据. ...

  6. Android数据库升级实例

    第一部分 Andoird的SQLiteOpenHelper类中有一个onUpgrade方法.帮助文档中只是说当数据库升级时该方法被触发.经过实践,解决了我一连串的疑问: 1. 帮助文档里说的“数据库升 ...

  7. Android 数据库升级中数据保持和导入已有数据库

    一.数据库升级: 在我们的程序中,或多或少都会涉及到数据库,使用数据库必定会涉及到数据库的升级,数据库升级带来的一些问题,如旧版本数据库的数据记录的保持,对新表的字段的添加等等一系列问题,还记得当我来 ...

  8. Android数据库升级,数据不丢失解决方案

    假设要更新TableC表,建议的做法是: 1) 将TableC重命名为TableC_temp SQL语句可以这样写:ALERT TABLE TableC RENAME TO TableC_temp; ...

  9. android数据库升级的措辞

    在基类table增加upgrade操作: public abstract class DbBaseTable { private static final String TAG = "DbB ...

随机推荐

  1. tar 解压缩命令详解

    今天对目录及其文件进行压缩:/usr/local/test# tar -cvf /usr/local/auto_bak/test.tar /usr/local/test 仅打包,不压缩 # tar - ...

  2. JAVA CDI 学习(4) - @Alternative/@Default/@Any & Extension

    前面几节学习到的CDI内容,基本上都是hard-code,以硬编码的方式在代码里指定注入类型,这并非依赖注入的本意,依赖注入的优势之一在于“解耦”,这一节我们将学习如何利用配置来动态注入的类型及属性初 ...

  3. 前端见微知著JavaScript基础篇:this or that ?

    上节,我们提到了this关键字的问题,并且追加了一句很有意义的话:谁调用我,我指向谁.的确,在javascript中,在默认情况下,this会指向一个已经初始化的window对象.所以你不论有多少全局 ...

  4. java中String、StringBuffer、StringBuilder的区别

    java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

  5. 谈对象 MVC 和 多端

    什么是对象? 我是单身狗,我没有对象:我是C程序猿,我没有对象:我是程序猿,我只会new一个对象. 言归正传,想想从一个电商网站上买一个东西,“进入首页,搜索商品,选型购买,登录下单,支付完成”,这里 ...

  6. 拥抱HTML5 — Page Visibility(页面可见性) API介绍

    H5 提供了很多简单实用的 API,Page Visibility API 就是其中之一. 不知道用户是不是在与页面交互,这是困扰广大 Web 开发人员的一个主要问题.如果 页面最小化了 或者 隐藏在 ...

  7. APP架子迁移指南(三)

    在完成上一篇之后,断断续续的开始重构我的Android项目代码,现在终于完成了.在重构期间又仔细阅读了一些开源项目的源码及文章,并询问了一些大神思路,按照理解自己完成了MVP结构的重构,与google ...

  8. bootstrap的popover插件在focus模式时在Safari浏览器无法使用的bug解决方案

    前言 最近在使用bootstrap的popover插件,效果如下: popover插件的focus模式时表现为当点击按钮时弹出浮动层,在点击浮动层外的任何一处,都隐藏浮动层. 但是在mac下的Safa ...

  9. JavaScript 10分钟入门

    JavaScript 10分钟入门 随着公司内部技术分享(JS进阶)投票的失利,先译一篇不错的JS入门博文,方便不太了解JS的童鞋快速学习和掌握这门神奇的语言. 以下为译文,原文地址:http://w ...

  10. SQL2008R2 不支持用该后端版本设计数据库关系图或表

    向下不兼容. 要么安装SQL2012,要么把SQL2012数据库通过脚本转成2008