12
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Android: SQLiteインサート高速化で、パフォーマンスのイライラを解消する

Last updated at Posted at 2015-06-29

AndroidのSQLiteでバルクインサートする方法です。

普通にインサートする時

通常のインサート処理
DatabaseHelper dbHelper = new DataBaseHelper();
SQLiteDatabase db = new dbHelper.getWritableDatabase();

//インサートするデータのArrayList
List<ContentValues> valueList = new ArrayList<ContentValues>();

//データ作成
ContentValues values = new ContentValues();
values.put("Name", "hoge");
values.put("Tel", "0000-1234-5678");
values.put("Age", 24);
valueList.add(values);
values = new ContentValues();
values.put("Name", "fuga");
values.put("Tel", "0000-1234-5678");
values.put("Age", 30);
valueList.add(values);

for (ContentValues val : valueList) {
    long ret = db.insert("MyTable", null, val);  
    if (ret < 0) {
        Log.d("ログのタグ", "インサート失敗!!!!!");
    }
}
db.close();

```

このようにArrayListをLoopで回して1件ずつインサートするとSQLiteは1件ずつインサートするごとに
トランザクションのコミットを行います
少量のデータのインサートなら1件ずつトランザクションコミットが走ることは気になりませんが
大量データとなるとコミットのコストはバカになりません
そこでデータを全部インサートしたあとにコミットを行うことでトランザクションコミットのコストを最小限にすることができます

## バルクインサートする時

```java:バルクインサート処理
// トランザクション開始を宣言
db.beginTransaction();
try {
    for (ContentValues val : valueList) {
        long ret = db.insert("MyTable", null, val);  
        if (ret < 0) {
            Log.d("ログのタグ", "インサート失敗!!!!!");
        }
    }
    //トランザクション成功を宣言。
    db.setTransactionSuccessful();

} finally {
    // トランザクション終了
    db.endTransaction();
    db.close();
}



```

このように明示的にトランザクションの開始成功終了を宣言することでトランザクションコミットのタイミングをコントロールすることができます
`setTransactionSuccessful()`を呼び出すことでデータベースへの変更がコミットされ呼び出さなければロールバックされます
そのためこの方法には以下のメリットがあります

* 高速化
* 途中で失敗した場合ロールバックができる

## パフォーマンス比較
以下のサイトに比較があったので貼っつけておきます約2倍ほど高速です
> http://www.atmarkit.co.jp/ait/articles/0905/20/news111_2.html

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/8f56418d-5aa6-6df9-65f4-14ba69ea21a9.png)
12
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?