android sqlite批量操作,Android: SQLite批量插入数据的最佳实践
大家都知道,Android里數據庫用的是SQLite。在實際開發過程中,我們有時候會遇到批量插入數據的場景。這篇文章給大家分享一個小技巧,讓批量插入數據達到最快的目的。
首先,我先創建一個Table,里面只有一個字段:
public static final String TABLE_NAME = "demo_data";
public static final String COLUMNS_NAME = "name";
private static final String SQL_TABLE_CREATE = "create table "
+ TABLE_NAME + "("
+ COLUMNS_NAME + " text"
+ ");";
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_TABLE_CREATE);
}
然后,獲取db對象:
DBHelper mDBHelper = new DBHelper(this);
SQLiteDatabase mDB = mDBHelper.getWritableDatabase();
好了,我們的準備工作做完了,接下來開始測試。
1.常規的插入方法
首先,是常規的插入操作,假設我要插入100000條數據。代碼如下:
for(int i = 0 ; i < 100000 ; i++){
ContentValues values = new ContentValues();
values.put(COLUMNS_NAME, "name: " + i);
mDB.insert(TABLE_NAME, null, values);
}
在我的小米8手機上,100000條數據的插入時間大概有12秒多,非常不能接受!
2.優化的插入方法
那我們怎么優化呢?其實很簡單,就是把所有的插入操作都包含在一個Transaction(事務)里:
mDB.beginTransaction();
try{
for(int i = 0 ; i < 100000 ; i++){
ContentValues values = new ContentValues();
values.put(COLUMNS_NAME, "name: " + i);
mDB.insert(TABLE_NAME, null, values);
}
mDB.setTransactionSuccessful();
}finally {
mDB.endTransaction();
}
經過這個小小的改動,插入時間大概只需要2秒多!提示了6倍多,厲不厲害!
可能有同學會問:為什么批量插入操作放在Transaction里可以把速度提示這么多?
其實原因也很簡單,在Android SQLite里,對所有的寫入操作(insert、update)等,都會在底層默默創建一個Transaction來完成。如果上層已經創建Transaction了(我們第二個例子),底層則不會再次創建。
所以,在我們的第一種寫法里,背后還隱藏著100000次創建Transaction的操作!而第二種寫法,只有一次創建Transaction的操作。把這部分開銷省掉了,速度自然能大幅提示。
還能不能再快點?
其實第二種寫法還有一個地方可以優化下,就是重用ContentValues對象。代碼如下:
mDB.beginTransaction();
try{
ContentValues values = new ContentValues();
for(int i = 0 ; i < 100000 ; i++){
values.put(COLUMNS_NAME, "name: " + i);
mDB.insert(TABLE_NAME, null, values);
values.clear();
}
mDB.setTransactionSuccessful();
}finally {
mDB.endTransaction();
}
在循環外只創建一個ContentValues對象,然后在每次使用完之后clear掉,下次循環繼續使用。
在實際測試過程中,這樣還能稍微提升一點點速度,這基本上也是批量插入的最優實踐了。
總結
以上是生活随笔為你收集整理的android sqlite批量操作,Android: SQLite批量插入数据的最佳实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 使用c 代码实现,JNI
- 下一篇: android config.mk,an