Android数据库小知识

博客转移到个人站点:
http://www.wangchengmeng.club/2018/02/04/Android%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B0%8F%E7%9F%A5%E8%AF%86/

欢迎来吐槽

Android数据库使用小技巧

1、数据的增量升级
首先完成sql的脚本,然后使用增量升级后,只需要修改DBVersion,不用修改其他代码。

代码:
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;
}

}

2、数据库事物的使用
数据库操作本身是很慢的,当才做数据成千上万条的时候就比较明显

做了一个小小的测试,当操作一千条数据的时候使用事物操作会提高七十几倍的速度。

事物操作也比较简单,在Android中使用事物操作是非常有用的,因为Android经常会因为某些原因(程序crash)终止数据操作。

db.beginTransaction();
try{
//在这里执行多个数据库操作
//执行过程中可能会抛出异常
db.setTransactionSuccessful();
//在setTransactionSuccessful和endTransaction之间不进行任何数据库操作
}catch(Exception e){
//当数据库操作出现错误时,需要捕获异常,结束事务
db.endTransaction();
throw e;
}
//当所有操作执行完成后结束一个事务
db.endTransaction();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值