天天看点

SQLite的事务操作

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();
        }
    }