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 ...
随机推荐
- 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)
清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...
- ajax请求过程中下载文件在火狐下的兼容问题
项目中碰到的问题,记录如下. 需求很简单,点击一个文件链接下载该文件,同时向后台发送请求.需求很常见,用户点击下载后通常要进行下载量的统计,统计的话可以利用 script标签 或者 img标签(图片p ...
- AMDJS编译工具
amdjs-build可以将amdjs标准的js代码编译成原生的js代码,从而在发布时去除多余的模块加载器代码. 比如像这样的代码: define("a/b", ["b& ...
- 调试记录:The public type <<classname>> must be defined in its own file
(摘自stackoverflow) “The public type <<classname>> must be defined in its own file” error ...
- Spring3+Mybatis3+Mysql+ivy+liquibase
Spring3+Mybatis3+Mysql+ivy+liquibase 集成 近一周时间所学技术:整合Spring+MyBatis+MySql+ivy+liquibase Mybatis:是一个基于 ...
- 【jQuery】Jquery.cookie()
注意:如果不设置path,默认为当前路径,新建cookie $.cookie('name', 'value'); 新建带限制时间cookie $.cookie('name', 'value', { e ...
- window php redis扩展下载地址
redis扩展下载 http://windows.php.net/downloads/pecl/snaps/redis/
- freemarker 分页取值
<#if pagination??&&pagination.list??> <#list pagination.list as video> <td al ...
- jQuery基础--样式篇(5)
jQuery的属性与样式 (1).attr()与.removeAttr():每个元素都有一个或者多个特性,这些特性的用途就是给出相应元素或者其内容的附加信息. attr()有4个表达式 attr(传入 ...
- zabbix_server的自动发现,实现批量添加主机,并链接到模板
一.需求 zabbix 服务器可以手动加入zabbix-agent客户端,对于少量的机器,这没有什么.但到了线上,我们有大量的服务器需要监控时,如果再一个个的手动加的话,工作量势必会增加很多.这时,z ...