【安卓】数据库基于脚本的"增量更新",每次更新时不需改动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代码、!的更多相关文章
- 【安德鲁斯】基于脚本的数据库"增量更新",如果不改变,每次更新java代码、!
思维: 1.当然,它是基于SQLiteOpenHelper.onCreate(第一个呼叫建立).onUpdate(当所谓的升级计划) 2.用"脚本"(脚本制作详细方法问度娘)做数据 ...
- atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4
atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4 目前近况:: 更换数据库,但是是使用spring集成的. <!-- hibernate配置文件路径 --> ...
- 【Quick 3.3】资源脚本加密及热更新(三)热更新模块
[Quick 3.3]资源脚本加密及热更新(三)热更新模块 注:本文基于Quick-cocos2dx-3.3版本编写 一.介绍 lua相对于c++开发的优点之一是代码可以在运行的时候才加载,基于此我们 ...
- 【转载】Unity 合理安排增量更新(热更新)
原帖地址:由于我看到的那个网站发的这篇帖子很大可能是盗贴的,我就暂时不贴地址了.避免伤害原作者 原版写的有点乱,我个人修改整理了下. --------------------------------- ...
- Windows下MySQL数据库备份脚本(一)
说明: MySQL数据库安装目录:C:\Program Files\MySQL\MySQL Server 5.0 MySQL数据库存放目录:C:\Program Files\MySQL\MySQL S ...
- 基于脚本的动画的计时控制(“requestAnimationFrame”)(转)
requestAnimationFrame 方法的支持,该方法通过在系统准备好绘制动画帧时调用该帧,从而为创建动画网页提供了一种更平滑更高效的方法.在此 API 之前,使用 setTimeout 和 ...
- Oracle - 数据库巡检脚本
分享一个oracle数据库巡检脚本,欢迎大家使用,希望大家在用的过程中发现脚本中的错误并提出改进意见. -- 数据库巡检脚本 -- 版本号2.1 -- 该脚本仅对数据库的做一个初步的巡检,具体的优化方 ...
- 小麦苗数据库巡检脚本,支持Oracle、MySQL、SQL Server和PG等数据库
目录 一.巡检脚本简介 二.巡检脚本特点 三.巡检结果展示 1.Oracle数据库 2.MySQL数据库 3.SQL Server数据库 4.PG数据库 5.OS信息 四.脚本运行方式 1.Oracl ...
- 基于 Apache Hudi 构建增量和无限回放事件流的 OLAP 平台
1. 摘要 在本博客中,我们将讨论在构建流数据平台时如何利用 Hudi 的两个最令人难以置信的能力. 增量消费--每 30 分钟处理一次数据,并在我们的组织内构建每小时级别的OLAP平台 事件流的无限 ...
随机推荐
- Android子线程创建Handler方法
如果我们想在子线程上创建Handler,通过直接new的出来是会报异常的比如: new Thread(new Runnable() { public void run() { Handler hand ...
- 47.使用 RequireJS 加载 AngularJS
转自:https://www.cnblogs.com/best/tag/Angular/ AngularJS 目前的版本没有遵循 Javascript 约定的 AMD 模块化规范, 因此使用 Requ ...
- 38.angular的scope作用域
转自:https://www.cnblogs.com/best/tag/Angular/ 1. Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带. S ...
- 131.typename在嵌套类中的作用
#include <iostream> using namespace std; class myit { public: static int num; class itit { }; ...
- 索引-mysql索引创建、查看、删除及使用示例
mysql索引创建.查看.删除及使用示例 1.创建索引: ALTER TABLE用来创建普通索引.UNIQUE索引或PRIMARY KEY索引. ALTER TABLE table_name ADD ...
- KafkaProducer的整体逻辑
概述 KafkaProducer是用户向kafka servers发送消息的客户端.官网上对producer的记载如下: Kafka所有的节点都可以应答metadata的请求,这些metadata中包 ...
- Swift学习笔记(1):基础部分
目录: 分号 常量和变量 数据类型 数值型类型转换 类型别名 元组 可选类型 API版本检查 分号 Swift并不强制要求你在每条语句的结尾处使用分号( ; ),你也可以按照自己的习惯添加分号.如果在 ...
- Debian9.5 系统配置NFS配置说明
NFS是Network File System的缩写,即网络文件系统.它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户端可以通过挂载(mount)的方式将NFS ...
- NodeJS学习笔记 (11)网络UDP-dgram(ok)
模块概览 dgram模块是对UDP socket的一层封装,相对net模块简单很多,下面看例子. UPD客户端 vs UDP服务端 首先,启动UDP server,监听来自端口33333的请求. se ...
- [POI2008]PLA-Postering(单调栈)
题意 N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们. (n<=250000,wi,di<=109) 题解 这种一堆矩形,又不像数据结构的题,一般都是单调栈. 考虑一个贪 ...