【安德鲁斯】基于脚本的数据库"增量更新",如果不改变,每次更新java代码、!
思维:
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脚本:
【安德鲁斯】基于脚本的数据库"增量更新",如果不改变,每次更新java代码、!的更多相关文章
- JNDI实现服务器(tomcat)与数据库(mysql)连接的数据源配置以及获取连接的java代码
->首先将mysql的jar包导入到tomcat/lib文件夹下 ->然后在tomcat/conf/context.xml文件中配置以下内容 <Resource name=" ...
- 基于Consul的数据库高可用架构【转】
几个月没有更新博客了,已经长草了,特意来除草.本次主要分享如何利用consul来实现redis以及mysql的高可用.以前的公司mysql是单机单实例,高可用MHA加vip就能搞定,新公司mysql是 ...
- 利用ant脚本 自动构建svn增量/全量 系统程序升级包
首先请允许我这样说,作为开发或测试,你一定要具备这种 本领.你可以手动打包.部署你的工程,但这不是最好的方法.最好的方式就是全自动化的方式.开发人员提交了代码后,可以自动构建.打包.部署到测试环境. ...
- 一个基于PDO的数据库操作类(新) 一个PDO事务实例
<?php /* * 作者:胡睿 * 日期:2011/03/19 * 电邮:hooray0905@foxmail.com * * 20110319 * 常用数据库操作,如:增删改查,获取单条记录 ...
- 基于脚本的动画的计时控制(“requestAnimationFrame”)(转)
requestAnimationFrame 方法的支持,该方法通过在系统准备好绘制动画帧时调用该帧,从而为创建动画网页提供了一种更平滑更高效的方法.在此 API 之前,使用 setTimeout 和 ...
- 利用ant脚本 自动构建svn增量/全量 系统程序升级包【转】
引文:我们公司是做自己使用产品,迭代更新周期短,每次都花费较多时间和精力打包做增量更新,发现了一篇文章用于 自动构建svn增量/全量 系统程序升级包,收藏之,希望可以通过学习,更加简化我们的工作. 文 ...
- C# 过滤HTML,脚本,数据库关键字,特殊字符
/// <summary> /// 过滤标记 /// </summary> /// <param name="NoHTML">包括HTML,脚本 ...
- 基于 EntityFramework 的数据库主从读写分离架构 - 目录
基于 EntityFramework 的数据库主从读写分离架构 回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目 ...
- 使用SQL脚本创建数据库,操作主键、外键与各种约束(MS SQL Server)
在实际开发中,可能很少人会手写sql脚本来操作数据库的种种.特别是微软的MS SQL Server数据库,它的SQL Server Management Studio对数据库的图形化操作极致简便,从而 ...
随机推荐
- 精讚部落::MySQL 的MEMORY engine
精讚部落::MySQL 的MEMORY engine MySQL 的MEMORY engine 無次要群組
- FFT算法的物理意义
FFT是离散傅立叶变换的高速算法,能够将一个信号变换到频域.有些信号在时域上是非常难看出什么特征的,可是如果变换到频域之后,就非常easy看出特征了.这就是非常多信号分析採用FFT变换的原因.另外,F ...
- SVN的项目管理
基于SVN的项目管理——集中与分散 我们在此处不讨论 GIT 比 SVN 好多少,也不讨论 Maven 和 Gradle 哪个好用,基于现有的开发环境,大多数公司还是采用 SVN + Maven ...
- tar.gz文件命名和压缩解压方法
tar.gz文件命名 tar这是文件打成一个包,无压缩; gz同gzip标记的包.tar文件压缩; 所以它成为一个.tar.gz档 压缩 # tar cvfz backup.tar.gz /xxx/ ...
- 摘要算法CRC8、CRC16、CRC32,MD2 、MD4、MD5,SHA1、SHA256、SHA384、SHA512,RIPEMD、PANAMA、TIGER、ADLER32
1.CRC8.CRC16.CRC32 CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长,应用也十分广泛,尤其是通讯领域,现在应用最多的就是 CRC32 算法,它产 ...
- iOS_10_tableView的简单使用_红楼十二钗
终于效果图: 方式1,用字典数组 BeyondViewController.h // // BeyondViewController.h // 10_tableView // // Created b ...
- queue C++
#include <iostream> using namespace std; class DequeEmptyException { public: DequeEmptyExcepti ...
- Linux从用户层到内核层系列 - GNU系列之glibc介绍
题记:本系列文章的目的是抛开书本从源代码和使用的角度分析Linux内核和相关源代码,byhankswang和你一起玩转linux开发 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswa ...
- WeText项目的服务端
WeText项目的服务端 在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 wi ...
- 启动和关闭JBoss As 7.1.1脚本
启动和关闭JBoss As 7.1.1,脚本例如以下djboss.sh: #!/bin/sh #JBOSS_HOME JBOSS_HOME=/opt/jboss case "$1" ...