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

情景:我现在要往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倍效率加速你的操作 – 源码巴士 

猜你喜欢

转载自blog.csdn.net/weixin_42602900/article/details/131168983