1. 程式人生 > >Android中,對SQLite的‘批處理’操作

Android中,對SQLite的‘批處理’操作

使用execSQL進行批處理插入

今天學習了一下如何更加高效的執行對SQLite的插入操作

注:用的是真機測試

我們使用SQLiteDatabase的insert方法和execSQL分別進行試驗

首先是insert方法:

public boolean insert(String table, ContentValues values) {
    if (values == null || values.size() == 0) {
           return false;
       }
       db = helper.getWritableDatabase();
       long
count = db.insert(table, null, values); return count > 0; //count >0 就說明插入了資料 }

接下來是測試資料:

        UserDAO userDAO = new UserDAO(mContext);

        ContentValues values = new ContentValues();
        values.put(TbUserColumn.PASSWORD, "password");

        long time1 = System.currentTimeMillis();
        Log
.i(TAG, "-------->>>非批處理插入操作開始執行:" + time1); for (int i = 0; i < 1000; i++) { values.put(TbUserColumn.USERNAME, "demo_user" + i); userDAO.insert(TbUserColumn.TABLE_NAME, values); } long time2 = System.currentTimeMillis(); Log.i(TAG, "-------->>>非批處理插入操作執行完畢:"
+ time2); Log.i(TAG, "-------->>>非批處理插入操作執行時間為:" + (time2 - time1)); List<Map<String, Object>> list = userDAO.query("SELECT * FROM tb_user", null); Log.i(TAG, "-------->>>執行資料後的數量為:" + list.size());

下面就是執行的結果了:
資料庫一開始是空的,如果獲取的資料是1000條,說明我們就全部插入成功了

這裡寫圖片描述

通過這張圖片,可以知道,插入一千條資料,需要11.5秒,這太耗時間了。

接下來我們再用execSQL方法測試一下插入一千條資料需要多少時間
先將資料庫檔案刪除,再進行測試。
首先是簡單封裝的方法

    public void execSQLByBatch(List<String> sqls) {
        if (sqls == null || sqls.isEmpty()) {
            return;
        }
        try {
            db = helper.getWritableDatabase();
            db.beginTransaction();
            for (String sql : sqls) {
                db.execSQL(sql);
            }
            db.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            db.endTransaction();
        }
    }

接下來是測試資料

        long startTime = System.currentTimeMillis();
        Log.i(TAG, "-------->>>批處理插入操作開始組裝資料");
        List<String> sqls = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            String sql = "INSERT INTO tb_user(userName,password) VALUES('" + i + "_user', 'password" + i + "')";
            sqls.add(sql);
        }
        long entTime = System.currentTimeMillis();
        Log.i(TAG, "-------->>>批處理操作組裝資料完畢,所花時間為:" + (entTime - startTime));
        startTime = System.currentTimeMillis();
        Log.i(TAG, "-------->>>批處理操作開始執行:" + startTime);
        userDAO.execSQLByBatch(sqls);
        entTime = System.currentTimeMillis();
        Log.i(TAG, "-------->>>批處理操作執行完畢:" + (entTime - startTime));
        List<Map<String, Object>> list = userDAO.query("SELECT * FROM tb_user", null);
        Log.i(TAG, "-------->>>獲取資料的條數:" + list.size());

最後就是結果圖了:

這裡寫圖片描述

使用execSQL進行批量操作,插入一千條資料也就只用了0.5秒的時間,相較insert方法,速度快了有 23 倍了 所以在進行批處理操作的時候,不妨使用這個方法。

但是測試這個方法的時候,另外試了下,插入主鍵已存在的資料,那麼會導致全部的資料都無法插入,是全部的資料。

可能是因為 db.setTransactionSuccessful();最後提交事務的時候,檢查了是否插入有sql語句執行失敗了,如果失敗了,就不提交事務了。(猜測而已,找個時間在測試一下)