通常,在用
arraylist
<
contentprovideroperation
>
operations
=new
arraylist
<
contentprovideroperation
>();
// do something.
operations
.add
(contentprovideroperation
.newupdate
(uri).
withvalue
(key1
,value1).
withvalue
(key2
,value2
)....
.build
());
// do something.cr.
(authority
,operations
);
原以為上面的**中,contentresolver幫忙處理了事務機制。
真正的解決方案是,需要顯示引入sqlite的transaction機制。
以實際專案為例,是乙個contentprovider。在繼承contentprovider的子類中
override名為bulkinsert的函式,加入transaction的支援:
@override
public
intbulkinsert
(uri
uri,
contentvalues
values)}
db.settransactionsuccessful
();}
finally
return
values
.length;}
並且改用contentresolver.bulkinsert方法來批量insert:
contentvalues
cnttvalues
=new
contentvalues
[size
];// do something. cr.
bulkinsert
(uri
,cnttvalues
);
經測試,1000左右的資料插入總耗時從40s降到2s左右——已經包括寫log到本地檔案的時間,所以優化效果還是非常可觀。
】
android SQLite大資料插入優化
sqlitedatabase db this.getwritabledatabase 獲取資料庫可寫物件 db.begintransaction 啟動事務 try 以上資料操作全部成功,通過標記settransactionsuccessful為true,事務才提交,否則回滾 預設標記為false d...
android sqlite插入與修改tips
table 要插入資料的表的名稱 nullcolumnhack 當values引數為空或者裡面沒有內容的時候,我們insert是會失敗的 底層資料庫不允許插入乙個空行 為了防止這種情況,我們要在這裡指定乙個列名,到時候如果發現將要插入的行為空行時,就會將你指定的這個列名的值設為null,然後再向資料...
android sqlite基本操作
package com.xiangqiao.sqlite3 import android.content.contentvalues import android.database.cursor import android.database.sqlite.sqlitedatabase import...