如何在Android应用程序中加速数据库(SQLite)中的大数据插入

时间:2012-07-04 11:37:24

标签: android performance sqlite arraylist

我的情况是我必须在数据库中插入数据,并且数据非常大,位于ArrayList。数据插入如下循环:

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

// cv.put statements

sqLiteDB.insert ......

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

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

2 个答案:

答案 0 :(得分:3)

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

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

此外,here是一篇博客文章,介绍如何提高插入速度。

修改 我也检查了SO,here是一个类似的问题。它声称使用交易可以提高速度。

答案 1 :(得分:1)

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

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();
}