Android数据库更新,批量执行大量的sql脚本

          数据库更新,根据数据库版本号,执行大量的sql文件,且文件很大,加起来共一百多M 。(我发表博客也是为了记录自己的成长,有不对的地方还请大家多多指点,谢谢。)

         项目中的sql文件: 。数据库更新要有版本号控制,每次执行完一个sql文件后,就要更改数据库的版本号,如果某个.sql文件出错,就会回滚整个.sql文件。我是把数据库的版本号存放到数据库里面。在程序登陆前,先把sqlfolder里面的所有的.sql文件的名字,如13011105,把所有sql文件的名字读出来放到一个数组并排序。

代码:

// 去assets文件夹下的sqlfolder文件下


String[] files = null;

int[] sortFile = null;

  final AssetManager assetManager = mContext.getAssets();

  try {
   files = assetManager.list("sqlfolder");
  } catch (IOException e) {
   Log.e("tag", e.getMessage());
  }
  sortFile = new int[files.length];
  for (int p = 0; p < files.length; p++) {
   // 递归调用 sql文件的名字为版本号
   int version = Integer.parseInt(files[p].substring(0, files[p].length() - 4));
   sortFile[p] = version;
  }
  // 排序
  Arrays.sort(sortFile);


 

 

然后取出本地数据库当前的版本号,循环与数组里面的数字比较,当大于本地数据库的版本号时,读取该.sql文件,执行更新操作,注意当.sql文件过长时,比如说1M以上时,最好把sql文件里面的sql语句分割一下放到一个数组里面,让sql文件100条100条的执行,不然会奔溃。代码如下:

final Handler handler = new Handler() {
public void handleMessage(Message msg) {
有部分省落
if (newVersion > databaseVersion) {
// 读取.sql文件
try {
InputStream in = assetManager.open(filea);
int size = in.available();
byte[] b = new byte[size];
in.read(b);
System.out.println("文件长度为:" + size);
in.close();

LSContDB lscontDB = new LSContDB(mContext);
Object[] subAry = splitAry(sqls, 100);
try {
lscontDB.executeUpdate(subAry, newVersion);
} catch (Exception e) {
progressdialog.dismiss();
.....
}


 

 分割.sql文件的方法:

public static Object[] splitAry(String[] ary, int subSize) {
int count = ary.length % subSize == 0 ? ary.length / subSize : ary.length / subSize + 1;
List<List<String>> subAryList = new ArrayList<List<String>>();
for (int i = 0; i < count; i++) {
int index = i * subSize;
List<String> list = new ArrayList<String>();
int j = 0;
while (j < subSize && index < ary.length) {
list.add(ary[index++]);
j++;
}
subAryList.add(list);
}
Object[] subAry = new Object[subAryList.size()];
for (int i = 0; i < subAryList.size(); i++) {
List<String> subList = subAryList.get(i);
String[] subAryItem = new String[subList.size()];
for (int j = 0; j < subList.size(); j++) {
subAryItem[j] = subList.get(j);
}
subAry[i] = subAryItem;
}
return subAry;
}


 

 下面是关键的地方即批量执行sql了,这里重要的一个地方是:如果.sql语句里面的sql语句在执行中抛异常时,该.sql文件的整个操作会被回滚.
 

// 数据库更新 执行sql语句的方法
public boolean executeUpdate(Object[] subAry, int newversion)
throws Exception {
boolean flag = true;
sqlitedb = db.getDB();
sqlitedb.beginTransaction();
try {
for (Object obj : subAry) {
String[] aryItem = (String[]) obj;
for (int i = 0; i < aryItem.length; i++) {
sqlitedb.execSQL(aryItem[i]);
}
}
// 把数据库里面的版本号设置为该file的名字
String sql = "UPDATE ldcode SET code = '" + newversion
+ "' WHERE codetype = 'dbversion';";
Log.d("更新数据库", "更新文件:" + newversion + ".sql");
sqlitedb.execSQL(sql);
//事务的标识,标识是否执行操作并成功执行到底
sqlitedb.setTransactionSuccessful();
} catch (Exception e) {
flag = false;
sqlitedb.endTransaction();
Log.e("更新数据库", "错误:" + e.toString());
Log.e("更新数据库", "错误文件:" + newversion + ".sql");

throw e;

}
sqlitedb.endTransaction();
return flag;
}


 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值