欢迎来吐槽
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();
}