我有一个庞大的数据需要在sqlite数据库中插入。
public synchronized void insert(ResponseModel[] response) {
for (int i = 0; i < response.length; i++) { // Here response length is 100
for (int j = 0; j < response[i].getPings().size(); j++) { // Here per response, ping size is around 300
ContentValues cv = new ContentValues();
if (response[i].getPings().get(j).getId() != null)
cv.put(Constants.ID, response[i].getPings().get(j).getId().toString().trim());
// More insertion code goes here
}
}
}
现在在这种情况下,应用程序需要花费太多时间。该应用程序不会挂起,因为它发生在后台线程中。 有没有办法有效地处理这个巨大的循环?
答案 0 :(得分:0)
不幸的是,Android SQLite API不支持批量插入。虽然您可以使用单个事务来优化执行时间。默认情况下,Android会为每个insert()
调用使用单独的事务。因此,在您的方案中,您将有30000个交易。开始和提交事务是一项耗时的操作。因此,您可以对所有插入使用单个事务:
try{
db.beginTransaction();
for (int i = 0; i < response.length; i++) { // Here response length is 100
for (int j = 0; j < response[i].getPings().size(); j++) { // Here per response, ping size is around 300
ContentValues cv = new ContentValues();
if (response[i].getPings().get(j).getId() != null) {
cv.put(Constants.ID, response[i].getPings().get(j).getId().toString().trim());
}
// More insertion code goes here
}
}
db.setTransactionSuccessful();
} catch (SQLException e) {
// Handle the exception...
} finally {
db.endTranscation();
}