我的情况是我必须在数据库中插入数据,并且数据非常大,位于ArrayList
。数据插入如下循环:
for( ..... )
ContentValues cv = new ContentValues();
// cv.put statements
sqLiteDB.insert ......
现在测试用例大约需要1分钟,实际数据预计超过10分钟,而目标是将时间保持在30秒以下。数据无法减少。我的问题是:
答案 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();
}