Android中,對SQLite的‘批處理’操作
阿新 • • 發佈:2019-01-08
使用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語句執行失敗了,如果失敗了,就不提交事務了。(猜測而已,找個時間在測試一下)