处理大型嵌套for循环以在android中插入db的有效方法

时间:2014-10-09 09:30:30

标签: android sqlite

我有一个庞大的数据需要在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
        }
    }
}

现在在这种情况下,应用程序需要花费太多时间。该应用程序不会挂起,因为它发生在后台线程中。 有没有办法有效地处理这个巨大的循环?

1 个答案:

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