Android 往Sqlitedatabase中插入大量数据效率问题,事务beginTransaction()

18 篇文章 0 订阅
文章讲述了在Android中,通过使用SQLite的事务处理(beginTransaction()和endTransaction())和批量插入数据,如何将插入10万条记录的时间从5分钟缩短到8秒,实现了近40倍的效率提升。关键在于减少磁盘操作次数,提高了应用的响应速度。
摘要由CSDN通过智能技术生成

情景:我现在要往sqlite database中的表中(R_USER_QUESTION_DO_HISTORY)插入十万条数据

1.我的代码:

  public void setUpDataBaseForUser(String userID) {
        String[] column = {
                Config.COLUMN_USERID,
        };
        String selection = "UserID = '" + userID + "'";
        Cursor cursor = database.query(Config.TABLE_R_USER_QUESTION_DO_HISTORY, column, selection, null, null, null, null);
        if (cursor.getCount() == 0) {
            //初始化表: R_User_Question_Do_History
            int rowNum = getTotalRowInTable(Config.TABLE_R_USER_QUESTION_DO_HISTORY);

            try {
                ContentValues values = new ContentValues();
                for (int i = 0; i < 100000; i++) {
                    values.put(Config.COLUMN_USERID, userID);
                    rowNum = ++rowNum;
                    values.put(Config.COLUMN_QUESTIONNUM, rowNum + "");
                    values.put(Config.COLUMN_ISCOLLECTED, 0);
                    values.put(Config.COLUMN_WRONGTIMES, 0);
                    values.put(Config.COLUMN_RIGHTTIMES, 0);
                    database.insert(Config.TABLE_R_USER_QUESTION_DO_HISTORY, null, values);
                }

            } catch (Exception e) {
                throw e;
            } finally {
                cursor.close();

            }
        }
    }

在activity中调用这个方法:

 DBUtil dbUtil = new DBUtilConcreate();
        dbUtil.initDataBase();
        System.out.println("准备插入数据,当前时间:" + (new Date()));
        dbUtil.setUpDataBaseForUser("A101");
        System.out.println("数据插入结束,当前时间:"+(new Date()));

代码的确能完成100000条数据的插入,但是当把app运行起来的时候,却发现,这个功能却花费了5分钟都没有完成,你可以看到下
插入数据之前的时间是:11:32:01

数据插入成功的时候却是:11:37:13

试想一下,如果一个app为了完成这个功能花了5分钟都没有完成话,那么还会有谁会想用这个app?

这里写图片描述
2.接下来就是提高效率的时候了:

对原来的代码稍作修改:

public void setUpDataBaseForUser(String userID) {
        String[] column = {
                Config.COLUMN_USERID,
        };
        String selection = "UserID = '" + userID + "'";
        Cursor cursor = database.query(Config.TABLE_R_USER_QUESTION_DO_HISTORY, column, selection, null, null, null, null);
        if (cursor.getCount() == 0) {
            //初始化表: R_User_Question_Do_History
            int rowNum = getTotalRowInTable(Config.TABLE_R_USER_QUESTION_DO_HISTORY);
            //加上的代码
            database.beginTransaction();
            try {
                ContentValues values = new ContentValues();
                for (int i = 0; i < 100000; i++) {
                    values.put(Config.COLUMN_USERID, userID);
                    rowNum = ++rowNum;
                    values.put(Config.COLUMN_QUESTIONNUM, rowNum + "");
                    values.put(Config.COLUMN_ISCOLLECTED, 0);
                    values.put(Config.COLUMN_WRONGTIMES, 0);
                    values.put(Config.COLUMN_RIGHTTIMES, 0);
                    database.insert(Config.TABLE_R_USER_QUESTION_DO_HISTORY, null, values);
                }
                //加上的代码
                database.setTransactionSuccessful();
            } catch (Exception e) {
                throw e;
            } finally {
                cursor.close();
                //加上的代码
                database.endTransaction();
            }
        }
    }

现在再运行一次,
这里写图片描述
你可以清清楚楚地看到,

插入数据之前的时间是:11:39:57
数据插入结束时间是:11:40:05

是的,加了三行代码之后,只花了8秒的时间,只用了原来的1/40左右。

这是为什么呢?
因为我们每一次insert操作,都涉及一次磁盘操作,10000次条数据就是10000次磁盘操作,我们的时间都浪费在了磁盘操作上。
我们把10000次地insert操作作为一个事物,来操作,减少磁盘操作次数,所用时间自然而然地就快了不少,那可是将近40倍地效率啊。

使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功,则所有从beginTransaction()开始的操作都会被提交,如果没有调用setTransactionSuccessful() 方法则回滚事务。

android中的事物使用方法:

              database.beginTransaction();
            try {
                //这里写你的代码

                database.setTransactionSuccessful();
            } catch (Exception e) {
                throw e;
            } finally {

                database.endTransaction();
            }

转载于:Android 往Sqlitedatabase中插入大量数据效率问题,40倍效率加速你的操作 – 源码巴士 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值