【安德鲁斯】基于脚本的数据库"增量更新",如果不改变,每次更新java代码、!

【安德鲁斯】基于脚本的数据库"增量更新",如果不改变,每次更新java代码、!

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

思维:

1.当然,它是基于SQLiteOpenHelper.onCreate(第一个呼叫建立)、onUpdate(当所谓的升级计划)

2.用”脚本”(脚本制作详细方法问度娘)做数据库升级,文件名称标识相应版本号,java中依据“上一版本号、当前版本号”选择运行的脚本。

升级时,改动DB_VERSION(当前版本号)就可以。

DBManager.java:

package com.example.test;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBManager extends SQLiteOpenHelper {

	private final static String DBNAME = "mydata.db";

	private final static int DB_VERSION = 1;

	private static DBManager instance;

	public DBManager(Context context) {
		// TODO Auto-generated constructor stub
		super(context, DBNAME, null, DB_VERSION);
	}

	public static DBManager getThis() {
		if (instance == null)
			instance = new DBManager(MainActivity.getThis());

		return instance;
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		initDb(db, 0, DB_VERSION);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		initDb(db, oldVersion, newVersion);
	}

	// 初始化db,运行脚本
	// 注:1>运行"(oldV,newV]"(全新安装时,oldV=0)间的脚本
	// 2>缺失的脚本会直接跳过
	private void initDb(SQLiteDatabase db, int oldVersion, int newVersion) {
		for (int i = oldVersion + 1; i <= newVersion; i++)
			execDBScript(db, "db/update" + i + ".sql");
	}

	// 运行脚本
	private void execDBScript(SQLiteDatabase db, String assetName) {
		try {
			InputStream is = MainActivity.getThis().getAssets().open(assetName);
			String stats = read(is);
			execSqls(db, stats);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	// 批运行,用";"隔开
	private void execSqls(SQLiteDatabase db, String stats) {
		// onCreate/onUpdate内部已带事务,多层嵌套无影响(最外层起作用)
		db.beginTransaction();
		String[] sqls = stats.split(";");
		for (int i = 0; i < sqls.length; i++) {
			String sqlStatement = sqls[i].trim();
			// TODO You may want to parse out comments here
			if (sqlStatement.length() > 0) {
				// 捕获错误,防止运行drop时 直接越过
				try {
					db.execSQL(sqlStatement + ";");
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
		}
		db.setTransactionSuccessful();
		db.endTransaction();
	}

	public static String read(InputStream instream) throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = 0;
		while ((len = instream.read(buffer)) != -1) {
			bos.write(buffer, 0, len);
		}
		String ret = new String(bos.toByteArray());
		return ret;
	}

}

db脚本:

【安德鲁斯】基于脚本的数据库&quot;增量更新&quot;,如果不改变,每次更新java代码、!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117800.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 流水线设计的概念_流水线原理

    流水线设计的概念_流水线原理流水线设计的概念它是面积换取速度思想的又一种具体现。所谓流水线设计实际上是把规模较大、层次较多的组合逻辑电路分为几个级,在每一级插入寄存器并暂存中间数据。流水线处理是提高组合逻辑设计的处理速度和吞吐量的常用手段。如果某个组合逻辑设计的处理流程可以分为若干步骤,而且整个数据处理过程是“单流向”的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法提高数据处理频率,即吞吐量。……

    2022年8月14日
    7
  • Linux驱动之串口(UART)

    Linux驱动之串口(UART)

    2022年3月13日
    40
  • Windows wpf(下载应用介绍教程)

    一、窗体类基本概念    对于WPF应用程序,在VisualStudio和ExpressionBlend中,自定义的窗体均继承System.Windows.Window类。用户通过窗口与WindowsPresentationFoundation(WPF)独立应用程序进行交互。窗口的主要用途是承载可视化数据并使用户可以与数据进行交互的内容。独…

    2022年4月13日
    45
  • openGL研究钞四 : 关于颜色, 尺寸, 虚线, 多边形逆转, 空洞, 使用位图

    openGL研究钞四 : 关于颜色, 尺寸, 虚线, 多边形逆转, 空洞, 使用位图

    2022年1月14日
    57
  • Android中实现二级菜单

    Android中实现二级菜单公司项目里的需求,商城的左下角,要求有分类的Menu。看图:1.当点击一级分类,修改二级菜单里面的内容。2.同时一级菜单里的背景变为右边有白色三角的背景。3.当点击二级菜单的条目时候,Popupwindow消失,并且界面更新对应条目的商品数据。我的实现思路是:左下角弹出Popupwindow,里面使用两个ListView实现。我的Demo的效果:

    2022年5月9日
    43
  • 查看Mysql锁情况

    查看Mysql锁情况#当前运行的所有事务select*frominformation_schema.innodb_trx;#当前出现的锁select*frominformation_schema.innodb_locks;#锁等待的对应关系select*frominformation_schema.innodb_lock_waits#查看下autocommit的值se…

    2022年6月1日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号