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都达到理想状态,那么就需要在升级的过程中,做到逐级升级。否则,如果在某个数据库版本的跟新操作中执行了数据定义语言,跳过这个版本,后面势必会出现问题。
相关代码
/**
* 将数据库逐级更新到指定版本
* @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数据库升级的更多相关文章
- 优雅的处理Android数据库升级的问题
原始完成于:2015-04-27 19:28:22 提供一种思路,优雅的处理Android数据库升级的问题,直接上代码: 1 package com.example.databaseissuetest ...
- Android 数据库升级解决方案
转自:http://blog.csdn.net/leehong2005/article/details/9128501 请考虑如下情况: 在数据库升级时,不同版本的数据库,他们定义的表结构完全可能是不 ...
- Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())[4]
数据库版本升级对软件的管理操作. 我们手机经常会收到xxx软件升级什么的提醒,你的软件版本更新,同时你的数据库对应的版本也要相应的更新. 数据库版本更新需要主要的问题: 软件的1.0版本升级到1.1版 ...
- Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())的注意点
以下内容可以作为面试官在面试的时候的问题,感觉比较好,是比较常用的知识点,可以用来考察基础是否扎实. 也可以程序猿学习.开发中的注意点.因为稍微不注意,就有可能导致数据库不能用. DBAdapter. ...
- Android数据库升级不丢失数据解决方案
在Android开发中,sqlite至关重要,增删查改不多说,难点在于,1,并发,多个线程同时操作数据库.2,版本升级时,如果数据库表中新加了个字段,如何在不删除表的情况下顺利过渡,从而不丢失数据. ...
- Android数据库升级实例
第一部分 Andoird的SQLiteOpenHelper类中有一个onUpgrade方法.帮助文档中只是说当数据库升级时该方法被触发.经过实践,解决了我一连串的疑问: 1. 帮助文档里说的“数据库升 ...
- Android 数据库升级中数据保持和导入已有数据库
一.数据库升级: 在我们的程序中,或多或少都会涉及到数据库,使用数据库必定会涉及到数据库的升级,数据库升级带来的一些问题,如旧版本数据库的数据记录的保持,对新表的字段的添加等等一系列问题,还记得当我来 ...
- Android数据库升级,数据不丢失解决方案
假设要更新TableC表,建议的做法是: 1) 将TableC重命名为TableC_temp SQL语句可以这样写:ALERT TABLE TableC RENAME TO TableC_temp; ...
- android数据库升级的措辞
在基类table增加upgrade操作: public abstract class DbBaseTable { private static final String TAG = "DbB ...
随机推荐
- 单页面网站关于id冲突的解决办法
最近做了一个单页面的网站,所有的页面加载都是通过局部刷新的方式,并且不用iframe,并且我们引入了动态tab页签: 所有的页签里的内容都只是一个元素,都在同一个html页面上,没有任何iframe分 ...
- VMware Fusion 中如何复制centos/linux虚拟机
今天想在mac本上,弄几个centos的虚拟机,尝试搭建hadoop的全分布环境.一台台虚拟机安装过去太麻烦了,想直接将现有的centos虚拟机复制几份完事,但是复制出来的虚拟机无法上网,折腾了一翻, ...
- WPF:自动执行"机器人"程序若干注意事项
企业应用中,经常会遇到一些需要定时自动执行的程序来完成某些功能,比如:自动定时从第三方web service取回数据.定时对历史数据进行清理.定时向ftp上传业务数据... 这类程序,我习惯称为“机器 ...
- HTTP真的很简单
原文:HTTP Made Really Easy因为我本身网络基础就很差,所以看到这篇文章一方面是学习网络知识,另一方面为了锻炼我蹩脚的英语水平,文中如有错误,欢迎浏览指正! 前言 在看这篇文章的时候 ...
- Android闹钟设置的解决方案
Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案. 主要问题 API19开始AlarmMan ...
- 如何实现侧边栏菜单之间的分割线——不用border-bottom
相信大家都遇到过这样一个老生常谈的问题,就是如果当我们所要做的菜单是侧边栏,垂直方向自上而下的排列的菜单栏,我们在做的时候通常的构想是这样的,就是在每两个菜单之间添加分割线,通常的想法就是说给每个菜单 ...
- 25 uname-用于显示系统信息
uname可显示电脑以及操作系统的相关信息. 语法 uname [-amnrsv][--help][--version] 参数说明: -a或--all 显示全部的信息. -m或--machine 显示 ...
- jquery渐渐的显示、隐藏效果
<!DOCTYPE html> <html> <head> <meta charset="gb2312" /> <title& ...
- 一个Activity掌握Android5.0新控件 (转)
原文地址:http://blog.csdn.net/lavor_zl/article/details/51279386 谷歌在推出Android5.0的同时推出了一些新控件,Android5.0中最常 ...
- jquery使用淘宝接口跨域查询手机号码归属地实例
<h1>手机号码归属地查询</h1> <div class="outer"> <p>请输入手机号码</p& ...