1

データベースにデータを挿入する必要があり、データが非常に大きく、ArrayList. データは次のようにループに挿入されます。

for( ..... )
ContentValues cv = new ContentValues();

// cv.put statements

sqLiteDB.insert ......

現在、テスト ケースでは約 1 分以上かかり、実際のデータでは 10 分を超えると予想されますが、目標は 30 秒未満の時間を維持することです。データは削減できません。私の質問は次のとおりです。

  1. 速度を改善する方法
  2. sqLiteDB.insert 関数の繰り返し呼び出しを回避し、すべての行を 1 つのバッチで挿入する方法はありますか?
4

2 に答える 2

3

あなたのケースで考えられる速度改善の1つは、次のようなコードを持つことです:

ContentValues cv = new ContentValues();
for(....) {
    //cv put
    sqLiteDB.insert
    cv.clear();
}

また、挿入速度を改善する方法についてのブログ記事はこちらです。

EDIT 私もSOをチェックしましたが、ここに同様の質問があります。トランザクションを使用すると速度が向上すると主張されています。

于 2012-07-04T11:50:04.183 に答える
1

私はこれをsqliteで試していませんが、mssqlで同様のことをしました。ほとんどの場合、トランザクションのオープン/クローズは挿入よりも時間がかかります。1回のトランザクションですべてを実行できます..試してみる価値があります。

db.beginTransaction();
try {
    SQLiteStatement insert = null;
    insert = db.compileStatement("INSERT OR REPLACE INTO \"MyTable\" ("
            + "\"MyColumnName\") VALUES (?)");

    for (i = 0; i++; i < 10000)
    {
        insert.bindLong(1, i);
        insert.execute();
        insert.clearBindings();
    }

    db.setTransactionSuccessful();
}
catch (Exception e) {
    String errMsg = (e.getMessage() == null) ? "bulkInsert failed" : e.getMessage();
    Log.e("bulkInsert:", errMsg);
}
finally {
    db.endTransaction();
}
于 2012-07-04T11:47:11.753 に答える