1

我有一种情况,我必须在数据库中插入数据,并且数据非常大,位于ArrayList. 数据被插入到这样的循环中:

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

// cv.put statements

sqLiteDB.insert ......

现在测试用例大约需要1分钟多,真实数据预计超过10分钟,而目标是保持在30秒以下。不能减少数据。我的问题是:

  1. 如何提高速度
  2. 有没有办法避免重复调用 sqLiteDB.insert 函数并在一批中插入所有行?
4

2 回答 2

3

在您的情况下,可能的速度改进之一是拥有这样的代码:

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

此外,这里有一篇博客文章如何提高插入速度。

编辑 我也检查了所以这里是一个类似的问题。据称使用事务可以提高速度。

于 2012-07-04T11:50:04.183 回答
1

我没有为 sqlite 尝试过这个,但在 mssql 中做了类似的事情。大多数情况下,打开/关闭事务比插入花费更多时间。所以你可以在一笔交易中完成所有事情。值得一试。

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 回答