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 ...
随机推荐
- Beta版本项目展示要求
项目评审的定在1月5日上午9:00在新主楼D225进行. 在Beta阶段项目评审会上, 每个团队有12分钟展示时间,10分钟问答和机动时间,我们的展示也不需要PPT,大家把要展现的东西写成博客(可以有 ...
- Theano3.1-练习之初步介绍
来自 http://deeplearning.net/tutorial/,虽然比较老了,不过觉得想系统的学习theano,所以需要从python--numpy--theano的顺序学习.这里的资料都很 ...
- 【BZOJ1002】【FJOI2007】轮状病毒(生成树计数)
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1766 Solved: 946[Submit][Status ...
- JPEG格式
Jpg文件格式[参考] 微处理机中的存放顺序有正序(big endian)和逆序(little endian)之分.正序存放就是高字节存放在前低字节在后,而逆序存放就是低字节在前高字节在后.例如,十六 ...
- Trilateration三边测量定位算法
转载自Jiaxing / 2014年2月22日 基本原理 Trilateration(三边测量)是一种常用的定位算法: 已知三点位置 (x1, y1), (x2, y2), (x3, y3) 已知未知 ...
- 贪吃蛇C#和JAVA实现
using System; using System.Windows.Forms; using System.Drawing; class Window : Form { Point[] a = ]; ...
- android 资讯阅读器(二)
接着上次的博客,上次移植完了tab以后整个app的框架就算是定下来了. 本次目标: 1.数据的获取与展示(ListView) 2.官方的下拉刷新效果(SwipeRefreshLayout) 3.数据接 ...
- 【Alpha版本】冲刺阶段——Day 7
我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...
- Ubuntu14.04下安装Hadoop2.4.0 (单机模式)
一.在Ubuntu下创建hadoop组和hadoop用户 增加hadoop用户组,同时在该组里增加hadoop用户,后续在涉及到hadoop操作时,我们使用该用户. 1.创建hadoop用户组 2.创 ...
- MySQL多实例
http://www.kancloud.cn/digest/mysqlsummary/132842http://crazy123.blog.51cto.com/1029610/1611887/ htt ...