从SD卡读取并插入SQL表非常慢

时间:2012-07-22 15:05:58

标签: android performance sqlite insert opencsv

我有一个让我疯狂的问题,我很感激你们可能提供的任何想法。我将数据从CSV文件(使用openCSV)导入数据库,之前此过程已在大约3-5秒内完成,包括从服务器下载的时间。 CSV文件有3035条记录。我尝试将解析与CSV分离并插入表中,但无济于事。

虽然听起来很奇怪,但我的应用程序中的某些内容已经发生了变化,现在这个过程需要更长的时间。

缩小范围后,我发现插入表格对SQLite来说非常慢。我花了最后几个小时回到旧代码,看看是否有变化,但没有运气。

我遇到了一些类似的问题,他的答案建议我使用InsertHelper,我这样做了。这使得进口时间完全没有差别。目前插入数据需要60秒,以前只需要几个。

public void importFromCSV() 
{
    SQLiteDatabase db = this.getReadableDatabase();
    db.execSQL("DELETE FROM EXAMS");
    File SDCardRoot = Environment.getExternalStorageDirectory();
    File file = new File(SDCardRoot.getAbsolutePath() + "/Finals/Data/timetable.csv");
    CSVReader reader;
    int i = 0;
    try {
        reader = new CSVReader(new FileReader(file));
        String [] nextLine;
        while ((nextLine = reader.readNext()) != null) {                
            this.addExam(new Exam(nextLine[0],
                                  nextLine[1],
                                  nextLine[2],
                                  nextLine[3],
                                  nextLine[4],
                                  nextLine[5],
                                  nextLine[6],
                                  nextLine[7],
                                  nextLine[8],
                                  nextLine[9]));
        }           

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }



}

public void addExam(Exam exam) {
    SQLiteDatabase db = this.getReadableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_SESSION, exam.getSession());
    values.put(KEY_AWARDING_BODY, exam.getAwardingBody());
    values.put(KEY_QUALIFICATION, exam.getQualification());
    values.put(KEY_TITLE, exam.getTitle());
    values.put(KEY_EXAM_CODE, exam.getExamCode());
    values.put(KEY_DURATION, exam.getDuration());
    values.put(KEY_DATE, exam.getDate());
    values.put(KEY_START_TIME, exam.getStartTime());
    values.put(KEY_EXAM_NOTE, exam.getExamNote());
    values.put(KEY_MY_NOTES, exam.getMyNotes()); 
    db.insert(TABLE_NAME, null, values);

}

1 个答案:

答案 0 :(得分:4)

您的插入可能很慢,因为您必须为每个插入设置引用。 Jeff Sharkey实际上只是在Google IO 1012中详细讨论了这个问题。https://developers.google.com/events/io/sessions/gooio2012/103/基本上你应该尽可能少地处理所有事务。

try{
  db.beginTransaction();
  for each record in the list {
     do_some_processing();
     if (line represent a valid  entry) {
        db.insert(SOME_TABLE, null, SOME_VALUE);
     }
     some_other_processing();
  }
  db.setTransactionSuccessful();
} catch (SQLException e) {
} finally {
  db.endTranscation();
}