数据库升级代码学习

  业务场景及需求:全国每一个银行营业网点【指跟公司合作的】产品上线后。肯定须要升级业务以应对新的功能需求,那么数据库每次升级更新时都是在数据库管理工具中运行升级脚本。很不方便。此时需求:可以在业务系统代码中设置开关,须要升级的时候打开开关系统自己主动直接完毕升级.

思路:1)数据库里面有个对应的版本号号,服务里面有个版本号文件【以要升级到的版本号号命名】。

2)升级的时候查出服务里面的版本号和数据库里面的版本号,比对:假设版本号一样不升级。假设版本号不一样就运行服务里面的升级脚本.

以下看看基本的思路代码作为笔记,以后能够參考。

一)获取服务里面的全部脚本版本号文件名:以一个数组形式存在方便以后多个版本号的时候扩展用。

/**
	 * 获取全部脚本版本号文件名称称
	 */
	private ArrayList<String> getVersionsForFilePath(){
		String filePath = "";
		ArrayList<String> fileName = new ArrayList<String>();
		try {
			// filePath为放置数据库升级脚本的文件夹
			filePath = PropertiesHander.class.getResource("/assp/evoucher/sql/").toString();
			filePath = filePath.replace("file:", "");
			// 获取filePath下的全部文件名称
			File dir = new File(filePath);
			// 返回此抽象路径下的文件
			File[] files = dir.listFiles();       <strong> /<span style="color:#cc0000;">/展开该文件【以一个数组,由于该文件下可能有非常多个文件夹或者文件】</span></strong>

			for (int i = 0; i < files.length; i++) {
				// 推断此文件是否是一个文件
				if (files[i].isDirectory()) {
					fileName.add(files[i].getName());
				}
			}
			// 由小到大排序
			String templte = "";
			for (int i = 0; i < fileName.size() - 1; i++) {
				for (int j = 0; j < fileName.size() - i - 1; j++) {
					if (fileName.get(j).compareTo(fileName.get(j + 1)) > 0) {
						templte = fileName.get(j);
						fileName.set(j, fileName.get(j + 1));
						fileName.set(j + 1, templte);
					}
				}
			}
		} catch (Exception e) {
			throw new EVoucherException("获取自己主动升级脚本文件【 " +filePath+ " 】失败,检查配置是否正确。", e);
		}

		return fileName;
	}

二)依据当前版号及当前服务使用的数据库类型获取相应升级脚本

/**
	 * 依据当前版号及当前服务使用的数据库类型获取相应升级脚本
	 * @param version
	 * @param userBbType
	 */
	public Map<String, String[]> getSqlScriptsForDBType(String version, String userBbType){
		Map<String, String[]> map = new HashMap<String, String[]>();
		try {
			String filePath = DataBaseUPdateThread.class.getResource("/assp/evoucher/sql/" + version + "/" + userBbType).toString();
			filePath = filePath.replace("file:", "");
			// 获取filePath下的全部文件名称
			File dir = new File(filePath);
			// 返回此抽象路径下的文件
			File[] files = dir.listFiles();

			for (int i = 0; i < files.length; i++) {
				// 推断此文件是否是一个文件
				if (!files[i].isDirectory()) {
					map.put(files[i].getName(), this.getResourceString(files[i].getPath()));
					logger.info("获取版本【 " + version + " 】,数据库类型为【 " + userBbType + " 】相应的升级脚本【 " + files[i].getName() + " 】完毕。

");
				}
			}

		} catch (Exception e) {
			throw new EVoucherException("获取版本【 " + version + " 】,数据库类型为【 " + userBbType + " 】相应的升级脚本失败。", e);
		}

		return map;
	}
	

三)依据路径获取数据库脚本

/**
	 * 依据路径获取数据库脚本
	 * @param sqlAbsolutePath
	 * @return
	 * @throws Exception
	 */
	private String[] getResourceString(String sqlAbsolutePath) throws Exception {
		// 返回读取指定资源的输入流
		InputStream is = new FileInputStream(sqlAbsolutePath);
		BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
		String s = "";
		StringBuffer sb = new StringBuffer();
		while ((s = br.readLine()) != null)
			sb.append(s).append("\n");
		if(br != null){
			br.close();
		}
		if (is != null) {
			is.close();
		}
		return sb.toString().split(";");
	}
时间: 2024-09-29 04:31:12

数据库升级代码学习的相关文章

Android -- 面试 -- 数据库升级策略

升级:重写onUpgrade方法 确定 相邻版本 的差别,从版本1开始依次迭代更新,先执行v1到v2,再v2到v3-- 为 每个版本 确定与现在数据库的差别,为每个case撰写专门的升级代码. 降级 onDowngrade()数据库降级:比如从数据库4降级到数据库3必须重写该方法. @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { super.onDowngrade(db,

Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())

数据库版本升级对软件的管理操作. 我们手机经常会收到xxx软件升级什么的提醒,你的软件版本更新,同时你的数据库对应的版本也要相应的更新. 数据库版本更新需要主要的问题: 软件的1.0版本升级到1.1版本时,老的数据不能丢. 那么在1.1版本的程序中就要有地方能够检测出来新的软件版本与老的数据库不兼容,并且能够有办法把1.0软件的数据库升级到1.1软件能够使用的数据库. 换句话说,要在1.0软件的数据库的那个表中增加那个字段,并赋予这个字段默认值. 当然有的时候我们对更新后的 版本并没有什么好感,

iOS 数据库升级 如何进行操作?

在iOS开发中,经常会遇到数据库升级,修改删除表的某些字段,这就需要我们来进行处理了,下面分析两种数据库的升级处理问题! 1.比如:我们常使用fmdb或者其他方式创建sqlite数据库,但是由于版本迭代问题,常常有需求要更新数据库,比如加字段.删除.修改字段等等,怎么样才能升级数据库且保持原来存的数据有效呢,上代码: const static NSInteger FAMILY_LIST_DB_MANAGER_VER = 1; @implementation KSFamilyListDBManag

Android 数据库升级解决方案

转自:http://blog.csdn.net/leehong2005/article/details/9128501 请考虑如下情况: 在数据库升级时,不同版本的数据库,他们定义的表结构完全可能是不一样的,比如V1.0的表A有10个column,而在V1.1的表A有12个colum,在升级时,表A增加了两列,此时我们应该怎么做呢. 总体思路 1,将表A重命名,改了A_temp. 2,创建新表A. 3,将表A_temp的数据插入到表A. 下面代码列出了更新表的实现,upgradeTables,给

iOS 数据库升级

分享一段ios数据库代码.包括创建.升级.增删查改. 里面的那些类不必细究,主要是数据库的代码100%可用. 数据库升级部分,使用switch,没有break,低版本一次向高版本修改. // DB.h //iukey #import #import "sqlite3.h" #import "User.h" #import "ChatInfo.h" #import "DescInfo.h" @interface DBHelper

OpenERP 源码变更后数据库升级

转自:http://vivianyw.blog.163.com/blog/static/13454742220142114422130/?latestBlog OpenERP代码升级后需要对数据进行升级,否则只是替换代买,会遇到很多意想不到的问题.这里记录一下升级操作的过程(这里是基于手动源码安装的换进进行说明: 1. 需要停止OpenERP的服务,视具体的安装时的启动脚本可能是: sudo /etc/init.d/openerp stop 或者 sudo /etc/init.d/openerp

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

数据库升级的意义 我们在开发Android应用的时候,不可避免地要使用数据库.而数据库的结构在第一版的时候定下来,之后发布功能更新,或增加业务逻辑,原来的数据库结构可能就不适用了.而如果数据库的结构与之前版本的结构不同,新版本的应用读取旧数据库肯定会出问题.解决办法只有两种: 1.让用户卸载老版本再安装新的程序: 2.软件自行更新数据库结构. 第一种办法很明显不具备可操作性,而且用户一旦卸载软件,数据就丢失了,这是不能容忍的事情.因此,作为开发者必须妥善处理数据库的升级问题. 当然了,有的同学会

打造android ORM框架opendroid(七)——数据库升级方案

在上一篇博客<打造android ORM框架opendroid(六)--级联查询>我们讲了OpenDroid最后一块功能查询的实现原理.今天我们将进行OpenDroid一个重头戏,也是本系列博客的最后一篇--数据库升级方案. 说道数据库升级,我可是很头疼的, 为什么呢? 因为以前的项目中,根本没有考虑数据库升级方案的问题,就直接drop table了,这样导致的结果就是"以前的数据都消失了".额... 凭空消失确实不是很少的一件事,如果数据不重要还行,重要数据呢? 说消失就

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

原始完成于:2015-04-27 19:28:22 提供一种思路,优雅的处理Android数据库升级的问题,直接上代码: 1 package com.example.databaseissuetest; 2 3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5 import android.database.sqlite.SQLiteOpenHelper; 6 import and