在做Android上短信的備份還原功能時,短信的恢復思路最初斟酌的很簡單,循環解析文件,每得到1條短信,就調用SMSProvider的insert方法將短信插入數據庫,SMSProvider是短信數據庫操作的最基本的類,重載了父類ContentProvider的query,insert,delete和update方法,除insert方法,父類ContentProvider中還有個bulkInsert方法,該方法為批量插入,代碼以下:
可以看出來,該函數只是簡單的循環調用了insert方法,而insert是虛方法,所以真正在使用時會調用到SMSProvider的insert方法,并沒有速度上的優勢;
在實際使用進程中,要恢復的短信數量多時,速度有點沒法忍耐,決定斟酌下對速度的優化;
Android數據庫使用精致的Sqlite3,榮幸的是Sqlite3是支持事務的,自然就想到了統1事務對批量插入帶來的好處,這是嘗試速度優化的第1個方向,
帶來了其他風險,對短信這個利用是不被允許的。
……………………………………………………………………………………………………………………………………………………………………
這是很早之前寫的,目前嘗試失敗了,寫出緣由:
上面也提到了bulkInsert這個函數,他里面并沒有使用統1事務的方法來將短信批量插入,而是循環調用insert,并沒有甚么速度上的優勢與斟酌,我想Android的開發人員們,不可能不知道Sqlite3統1事務的方法,那他們為何放著不用呢??
緣由是如果使用統1事務會帶來另外1個風險--丟失收到的短信;事務的開啟是要鎖定DB的,也就是說開啟1個事務以后,其他對數據庫的寫入操作都是沒法成功的,這樣的話,如果在1次統1事務里操作的數據很多,需要消耗1定的時間,那末短信到來時,其是沒法被insert到數據庫里的,也就收不到這條短信了,與短信恢復這個操作速度慢來比,這更加不能被允許;另外1個風險就是死鎖,說究竟是由于Sqlite3對并發情況支持的不是很好;
經過我的實際測試,發現當數據庫里原來的數據不多時,統1事務的方法批量插入消耗的時間還是蠻少的,但隨著數據愈來愈多,就會愈來愈慢了~~~更好的實現方法自己再漸漸摸索吧,上面的嘗試也算學習了吧。。。。