sqlite中常常需要对大量数据批量操作。若使用for循环方法,效率较低。因为 sqlite操作数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。10000条记录就要进行10000次读写磁盘操作,而且不能保证所有数据都能成功操作。(有可能部分成功,另外一部分失败,后续还得删除。太麻烦)
解决方法:
添加事务处理,把10000条数据操作作为一个事务。这样可大幅度提高操作速度,往往效率高出10倍左右。
主要用到以下三个方法:
(1)开始事务
db.beginTransaction();
(2)循环完毕后,设置实务操作成功为true
db.setTransactionSuccessful();
(3)在finally语句中结束事务
db.endTransaction();
如果程序执行到endTransaction之前调用了 setTransactionSuccessful方法设置事务的标志为成功,则提交事务;如果没有调用setTransactionSuccessful方法则回滚事务。
使用事务,可以避免程序因为出错而终止运行,例如下面转款的例子。如果ATM机在转款过程中挂掉,通过事务处理可以防止之前运行结果的改变。
public void testTransaction() {
PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());
SQLiteDatabase db = openHelper.getWritableDatabase();
if (db.isOpen()) {
try {
//开启事务
db.beginTransaction();
//1.从张三账户中扣1000块钱
db.execSQL("update person set balance = balance - 1000 where name = 'zhangsan';");
//ATM机挂掉了
int result = /;
//向李四账户中加1000块钱
db.execSQL("update person set balance = balance + 1000 where name = 'lisi';");
//标记事务成功
db.setTransactionSuccessful();
} finally {
//停止事务
db.endTransaction();
}
}
}
下面是对10000条数据批处理的例子。
public void testTransactionInsert() {
PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());
SQLiteDatabase db = openHelper.getWritableDatabase();
if (db.isOpen()) {
//1.记住当前的时间
long start = System.currentTimeMillis();
//2.开始添加数据
try {
db.beginTransaction();
for (int i = ; i<; i++) {
db.execSQL("insert into person(name,age,balance) values ('wang"+i+"',"+(+i)+","+(+i)+")");
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
//3.记住结束时间,计算耗时
long end = System.currentTimeMillis();
long diff = end - start;
db.close();
}
}